|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗? A5 f, T; {# J9 p/ w" W j
2 Y' ]7 z$ k" C% {4 r$ v" _" Q
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。& o& W# A4 t1 W3 Z
D6 w! k( @. {0 d, H) L0 |以下是创建自定义插件的步骤:
( g* Z$ q+ x, ]8 j, P
|' ~7 o, h8 F% ^& B1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
5 c6 f: _! O! x5 ?; o6 J1 ^- @
! O8 d! H, ^ v ```* X- W1 Y% O5 A5 Z8 w* }1 \. V
<?php
" @% R' L! B/ I6 E* p# [ N( _ /*
, b4 w% K% Y" N0 V3 ~ Plugin Name: Site Wide Notices Plugin0 Z( S3 R+ b% s) R
Description: Adds a new custom post type for site-wide notices.3 n5 D& d! `' x, G4 X' C1 t+ ]
Version: 1.05 ^. Y/ A8 I6 y+ c' r0 l7 k8 e, h
Author: Your Name8 A" N& i U( \8 N' Y
Author URI: http://example.com
B( ]2 S0 t9 [) E! R+ S+ Z' N: q */
/ W* F) g1 y4 z4 h. D7 U% M( ]8 H
% C1 B' g* h, O7 J // Add plugin code here...* f7 q& B) e2 o6 Q( y2 z: X
```
! s" N; `# J+ ?2 R: X# X) l
( `6 _' b) J/ P5 x9 [ 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
+ u0 d' F W& f4 ]+ K8 T6 s" |4 V# F: o2 f c6 W
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
, y9 D* c1 H3 r; A6 p+ q' D& r# R6 @1 N8 U7 v
```. ^' D2 n- b% X
add_action('init', 'create_custom_post_type');1 p. d# K" H( n9 d. G2 B
function create_custom_post_type() {
# Q$ u0 Q( p9 l4 d $labels = array(& Y. L4 C, H; r
'name' => 'Site Wide Notices',
; ~0 E! {4 V E& Q8 [/ B% q2 i% q 'singular_name' => 'Site Wide Notice',
2 j8 p& B- o6 [4 o. U7 R 'add_new' => 'Add New',
I) _/ `" R& E3 a& ~0 l) o+ V/ \ 'add_new_item' => 'Add New Site Wide Notice',( \9 h- [$ s9 g% L& V
'edit_item' => 'Edit Site Wide Notice',
" V) U+ o/ C# x1 {9 K8 z7 G 'new_item' => 'New Site Wide Notice',6 @$ K7 N" {, ^% A, W: T; L
'view_item' => 'View Site Wide Notice',* }5 w" b# u. u: v+ G( A# v
'search_items' => 'Search Site Wide Notices',
+ y" ?: ]) d# d3 p% r) L# \ 'not_found' => 'No site-wide notices found',
: G# t$ v# M. `' {4 B- I) e 'not_found_in_trash' => 'No site-wide notices found in trash'
- G6 ~4 U7 i5 B6 H0 \1 [ );
8 V+ |9 a5 N' L! W0 L/ u, \* g) _' w# J
$args = array(
2 f& I4 x- w/ F) F6 s 'labels' => $labels,0 E' M% b# g. @! B0 H5 _
'public' => true,
2 i- x/ e0 f1 G+ L 'has_archive' => true," W* j5 K% T5 N* Q' ]1 N* @* e
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
9 G+ G+ A/ h$ b 'taxonomies' => array('category', 'post_tag'),( m/ f8 Q9 k2 G
'menu_icon' => 'dashicons-megaphone',
- R6 K- w. l& h! P' N 'menu_position' => 5,
5 R+ \' ^" n+ a; V 'rewrite' => array('slug' => 'site-wide-notices')( G/ C- v$ b- |3 _( Z1 J
);" M- c- O5 f0 S
* \' X# h3 H; O4 A
register_post_type('site-wide-notices', $args);
% Z6 ~& J$ Z( o; Q2 } }
2 V/ l/ U+ ?4 d- u6 ` ```
; ^- B g1 C- Q( p; b
6 B8 w# H6 q* X. V- j6 R 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。( A3 A1 H# _) t, { V: j4 q# X3 q
/ {" ` a3 F( K$ f H3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
0 {& u, v: f9 u; k/ Y: h* v7 |& K: @6 M: Y" }6 o( ]
```! k. [7 X6 k+ ^, K' }2 ^
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
" ?2 u6 ^- K* `2 ~. i5 S3 _( X function add_site_wide_notices_boxes() {
4 m* K& T+ D: G4 x# |( v4 O8 H R add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
( l1 H& u2 Y! Y' K/ o' W% o- g9 w }) v, |+ @, }) c. n6 J0 C9 I4 G
6 @1 l2 u/ `$ U& i( T
function notice_details_meta_box($post) {
2 V9 V n3 A. S s9 c wp_nonce_field(basename(__FILE__), 'notices_nonce');3 X* }2 h3 e9 a" b4 H& Y
$notice_title = get_post_meta($post->ID, 'notice_title', true);
* f( w. x3 F- g q# d, P' j $notice_content = get_post_meta($post->ID, 'notice_content', true);' o* a. [* g/ W; U: M/ Y
?>$ f! }- ]$ D* j( @" s7 J
<p>
8 d2 D! G6 ^+ y* w U, X" ^+ p <label for="notice-title">Notice Title</label><br>; _: X) {1 U( ?& N( L$ }$ D
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">" e# K: R6 i- I) a" L
</p>- T+ N H' J- |: U! } s' ~
<p>
F' H( p) ]9 \5 ]2 Q <label for="notice-content">Notice Content</label><br>6 B( d. L4 y" y
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>& R. n. l2 \# R6 \
</p>
. g0 l3 S8 K7 p- K5 b% L' {; ~( k3 X <?php
9 I& ]+ F0 K6 S* N+ ]$ ?1 Q }
2 A% T2 W. `% R! Y. E; S1 }' ~
add_action('save_post', 'save_site_wide_notice_meta_box');" A$ L- K/ V# a- Q9 j5 H0 O
function save_site_wide_notice_meta_box($post_id) {
T1 |) t. d: `2 ^7 P8 [6 a, x if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))) R, s: s. o% y s W1 i
return;
* v% R( M& ?& W if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
& N9 ]: n7 `# l% q, r return;. c5 [2 x# M( ~$ Q+ B! A
8 B8 {( ]; M: O% e. Z) F6 @7 U
if (isset($_POST['notice_title'])) {
8 `( {& L0 ^5 ?, |' w, W7 [- F( S update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));9 @! K, @, S L( v; X' t, [
}: D6 ?( m. I% T& t. l
if (isset($_POST['notice_content'])) {' Y8 D! Q+ B2 J g6 X. E$ e5 v
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));4 y* s! { |2 c5 g+ \
}& p3 R5 V% p) N' e7 U
}+ i- I3 \4 T. G
```
' p4 j- t6 K! Z% {+ C- b8 K5 s$ [$ b( i4 w" |& i8 D
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
6 ^5 B2 S, x& x2 e1 B6 [$ Z' l8 Q% O0 O7 u1 k
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:6 G( G! j% V3 {5 J2 N3 p
X" Y; }! N6 {; T ```/ v$ s e5 F8 `9 \/ s5 R4 G" O; C* l
$args = array(' C) d* K' U9 O) y, I) V- `
'post_type' => 'site-wide-notices',. h* `6 J: \7 S9 M9 |! F
'posts_per_page' => 3,, ~ \2 R. t/ V k W9 S" L& [+ v
'order' => 'DESC',
2 K: J8 G0 V" f 'orderby' => 'date'
* d7 j7 s+ d# O4 c );" c7 Q3 L) F& |3 U: _8 _9 O& b4 u
$query = new WP_Query($args);. {2 U0 g+ h/ j( k' \- ]8 }
if ($query->have_posts()) :
% F/ ?. R; A/ ~" W) W while ($query->have_posts()) : $query->the_post(); ?>- L8 l: {) m& w9 m' a! Y2 D2 t
<div class="notice">& p1 K+ K4 J; W+ y: ]8 ]' @5 @7 x* f
<h3><?php the_title(); ?></h3>
% y. S; m# {2 i0 j- S' v/ D <div class="notice-content"><?php the_content(); ?></div>1 f+ D ^( L _8 d+ o
</div>' f: d3 C4 Q+ e$ \* c7 w
<?php endwhile;
9 c) Q$ K# A K2 `( i3 N wp_reset_postdata();
9 I+ @, _6 z0 v7 ~, P U6 U- a1 ^; p endif;
* Z& ]( u+ X) h) v ```: `( N# J2 v U* c8 q
2 i% d& q+ H+ {* T 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|