|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
* y5 f. }. P: W0 I+ E$ ]- _# z- u0 h8 h! o; e) L3 c1 r
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。8 C. f9 Y0 e% \8 G
1 V4 d8 T/ ~* J以下是创建自定义插件的步骤:4 @) I9 d9 \) O0 X+ p. C
1 b6 e9 [6 G q1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
0 W7 K7 _% q2 o9 [' d( D a* i4 W$ @0 Y& K/ f. |2 d& f9 q
```
P+ C. M! ?2 v4 p1 B <?php0 v0 [) g. Q8 x8 k0 v& W8 h7 B. r
/*' h5 }9 h! c, E+ K, o) W) Z9 P8 l/ M
Plugin Name: Site Wide Notices Plugin% v! x+ s& ~3 O& h# C" q7 O5 m# Y4 k
Description: Adds a new custom post type for site-wide notices.. h7 W0 j# \; _. A
Version: 1.0
) ~/ n- R- m8 O r& O Author: Your Name; i6 W) u- a4 e% I4 Y* ^
Author URI: http://example.com
" D: D1 p( Z8 M, ^ */
6 G* _ v2 E8 V% p# V. W3 c
; z5 o% P0 n5 {- U( q1 _& ^' n // Add plugin code here... [ O; K1 }0 C5 ^5 Y, i- \7 C/ N$ O
```1 k; @+ G2 C& Z3 z; T. B
: y- O4 ], _ \8 Y" G5 z" u 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
' O% j4 J* B2 ?$ q& O: z2 `& @5 x; v$ @2 s8 j) D, ?+ R+ Z1 }! a
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:4 ]# e5 q& |5 L% o5 w0 l, @
; ~" A- c$ \! w5 G$ x! u/ [ ```
: b8 J! m/ r, Z6 C+ D. V7 G add_action('init', 'create_custom_post_type');
3 T! T* m$ z B6 w$ k2 D \ function create_custom_post_type() {
( s. C3 ^9 ~- |& f8 w% | $labels = array(9 n4 d$ j: Z- I" [7 i& b& v% o
'name' => 'Site Wide Notices',/ [% v+ v9 h2 Q- `; ~' p) @
'singular_name' => 'Site Wide Notice',
# r) y1 e! D5 ^/ q/ V3 \ A 'add_new' => 'Add New',
" B3 z0 c* F3 g6 `, f: i 'add_new_item' => 'Add New Site Wide Notice',! }1 o! a3 N0 }" {
'edit_item' => 'Edit Site Wide Notice',
$ W4 U8 {4 b! g. [+ X l% z f 'new_item' => 'New Site Wide Notice',( ]/ _/ ~3 f- Z! h$ i4 c' Z
'view_item' => 'View Site Wide Notice',
* k7 O! [: p1 C; W6 N" v 'search_items' => 'Search Site Wide Notices',8 x; |9 H' u& A- ^+ @
'not_found' => 'No site-wide notices found',& v0 w, f0 m7 c0 Q2 o
'not_found_in_trash' => 'No site-wide notices found in trash'9 U3 Q/ a) I4 L9 u
);
3 J: [0 T1 \% i' u- b5 O; @' h; s0 m$ H: i+ ^. K) k# x
$args = array(. ?7 ]9 O5 m7 l
'labels' => $labels,
$ Z4 l; y A. R0 }- {0 Q- u M& j 'public' => true,
* U% y8 E# d" {7 _6 l4 m 'has_archive' => true,
' g$ x* q i4 Y0 v& Y% Z2 I 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),% n$ U$ y0 v- P9 _$ j
'taxonomies' => array('category', 'post_tag'),1 A$ g; X4 ]4 _" K
'menu_icon' => 'dashicons-megaphone',; ] `1 l! A' @5 x- W
'menu_position' => 5,
0 V: n) m T% K r% r. e0 P% y y$ W 'rewrite' => array('slug' => 'site-wide-notices')
; Y( F& J4 i7 J f* @ );' _% a6 [/ _; ^- q
" x# O% H4 ^% y$ a/ Y8 | register_post_type('site-wide-notices', $args);
8 F7 ^ o; g% Z1 {5 \ }% e+ R9 B" q9 T1 x7 Y" M
```5 \# g! H+ }4 `, [' X! b1 @
# x& k) u9 N) Y
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。* T4 r4 @6 U% s2 S* _$ b
) g) P$ g9 I, ^ u; e
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
7 S- S8 x4 o* ~
$ r( z6 [" I$ O* p6 \( G ```! Q" ^! E4 `$ C/ b: \+ h, ^
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');: ~1 x' d: [1 ]8 g6 Q3 O
function add_site_wide_notices_boxes() {! I( [& p4 Q; g; r. b+ N- H
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
S* W, h. ?. j) Y }
; p" N4 n* G7 W1 q! S* Z6 K. J
function notice_details_meta_box($post) {
+ l. u o/ R# W1 A( h wp_nonce_field(basename(__FILE__), 'notices_nonce');
$ y/ |; v" z2 ~- n% }4 F4 L4 r2 r $notice_title = get_post_meta($post->ID, 'notice_title', true);
& N: V8 Z. t7 s $notice_content = get_post_meta($post->ID, 'notice_content', true);. m: z/ @0 W2 G" f, L
?># [6 y, }! C3 v- ^5 _6 M1 F
<p>
; Q. v4 E* U: d$ U <label for="notice-title">Notice Title</label><br>) A1 h6 t" Y7 K( S H
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">0 }0 a: [ u& A+ p8 d, X- ?
</p>
E; r& W3 B% u% Z6 f <p># g y g3 o, l0 I' l9 z
<label for="notice-content">Notice Content</label><br>
% r/ u [0 N1 }' i <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
7 }5 o" C, P6 E+ M2 \; Q </p>
* b% D- [6 z; B# S g <?php- k% J: _ F: V+ @" o
}
/ A8 O, t" H4 U& m
- J; v+ o% B7 }0 a- b# d add_action('save_post', 'save_site_wide_notice_meta_box');
9 P) R8 G4 Q2 @! k) z; a2 I function save_site_wide_notice_meta_box($post_id) {
3 o3 V) F5 F, e5 j8 n if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))); O) Q- ]/ ?0 w7 J5 _
return;( l: D, A" I& Z! B! N/ L/ w- x
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
! d) h4 M" y5 q6 v0 u return;
9 f6 ^: L# }+ f& {' s a
) M! m% W3 z1 d5 ] if (isset($_POST['notice_title'])) {; A! P. h$ I" E1 I+ Z7 w% n
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
# A, X( W+ C! Y5 f q6 t }, y, Z/ ?; h: c, I* A9 H* r
if (isset($_POST['notice_content'])) {
7 \& S# @6 Y$ H update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
H4 c+ p# U: s1 B) I }% J2 t/ @) T7 M3 W& U; w* L
}
( J; i8 G0 O. B$ G+ o ```: j1 r" }8 A, |$ j3 }2 i
; ^3 h3 U6 q$ {0 _7 B0 ]
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。$ }0 k& F( u) V9 L+ }5 d
5 ^2 X" t M# B0 L- |4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:9 w1 C. |5 j- p q) z+ B
' ~2 I6 T6 W" Q( a$ L3 D1 c I ```& s+ r4 |% s8 e) \+ G7 x
$args = array(" S# m, r# A) [0 w) i" ~
'post_type' => 'site-wide-notices',
% ]; A5 T) G* w 'posts_per_page' => 3,$ R0 V4 m4 @! h W/ B' Z8 G' @( _
'order' => 'DESC',
/ g- }% a+ D( i 'orderby' => 'date'
( ?! n1 n* B5 E) o# F7 a* n ] );
m- w+ [) T' P" ? $query = new WP_Query($args);
8 m+ r2 K0 s w if ($query->have_posts()) :
8 I* x% c) t( k- D while ($query->have_posts()) : $query->the_post(); ?>
3 K: z; [3 l4 K _" M <div class="notice">
1 t% T! l P. g4 t: g; I <h3><?php the_title(); ?></h3>
; X0 C+ v, G% X2 u1 r <div class="notice-content"><?php the_content(); ?></div>
9 R" E. O% w$ n, M </div>7 p5 u/ T& m% d, E7 D
<?php endwhile;7 t3 n" W% o: C- l& i1 M
wp_reset_postdata();
3 K, I& z+ x: { endif;
: A! {: f8 f3 E8 w7 W. b ```) j7 K6 i4 i: ^) _
( a2 `5 P% g1 O" ^" i: `/ X x 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|