|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?) i9 P! z* b+ z F
3 T5 \. x9 Y$ ?, m* Y, E% g
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
4 M z* S1 r- d O
$ T5 M/ H" k, O5 @以下是创建自定义插件的步骤:. @ ?, D9 Q5 v0 F
0 X" p4 B6 G5 C8 p; p9 X1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:+ R8 P4 |5 j' M% E: `
- ~/ D( A" I1 D
```
# P, d& ?; w+ l% d& z' L <?php4 t; D" e- K5 g$ q+ T
/*: i+ T5 o* k: ?
Plugin Name: Site Wide Notices Plugin8 D2 P, ^' z$ H1 v
Description: Adds a new custom post type for site-wide notices.7 A+ Q- D9 S/ F7 R9 }
Version: 1.0/ ^2 J4 ]0 S! }* d. L: O3 N- u
Author: Your Name
1 h% Q5 [, g' k$ q+ l( E Author URI: http://example.com8 |" Y( T! S2 d8 Q& e& Y3 @8 `" _
*/- k+ L2 H* ^5 n, o& Q9 O
6 o6 M. b0 z! |. A% r T2 d // Add plugin code here...4 C& W" j$ m& n$ Y
```; n) V: ]" S0 Q5 i
. g9 ?4 R2 H" R1 D) ]3 O
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
2 c7 X9 {0 K! s& H* [2 H" n
) H% ?( ^( P: f2 r3 I2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
c# y: ` Z' B2 q% i) h( s1 }# v! {0 h8 M, I
```
& b2 ^ C9 ~" \; \ add_action('init', 'create_custom_post_type');
5 [* x* i4 M! N- }# {8 W* c function create_custom_post_type() {
2 I" W: X( F: U- t" f! o& x $labels = array(! N5 `2 z) O; B7 k F4 _2 x; b* X
'name' => 'Site Wide Notices',
5 u5 M a8 z8 S8 Q0 U) X: o0 a, A 'singular_name' => 'Site Wide Notice',2 P9 k6 a0 @1 L2 B4 p& v7 e7 K
'add_new' => 'Add New',
2 y; `4 `" a6 U5 X& W* o 'add_new_item' => 'Add New Site Wide Notice',
3 A2 g# Z2 S0 ^! ]/ ?4 }% o 'edit_item' => 'Edit Site Wide Notice',
7 j6 R7 G- \0 g3 s# V 'new_item' => 'New Site Wide Notice',0 L) v% D8 V; G9 h* i
'view_item' => 'View Site Wide Notice',
3 K: ~0 i% F( ]) {) } 'search_items' => 'Search Site Wide Notices',. a M* b* a5 Y7 E" m
'not_found' => 'No site-wide notices found',* f4 G! P6 p- s1 F; n1 J
'not_found_in_trash' => 'No site-wide notices found in trash'. I* A U& T8 ^. a
);0 B3 ?% `: B* Z9 U( R
( \* H9 c; Y. |, `! c$ J% r: J- r1 q$ D j $args = array(
' J i0 Q# l5 |' O9 K 'labels' => $labels,
" ^( A& `! r% ]. e3 H4 O9 t/ h 'public' => true,
" n2 d9 l' c! }! G 'has_archive' => true," w1 a- y7 I! |: P( }: e
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'), S* e- ~0 A5 V1 K+ e7 g$ x
'taxonomies' => array('category', 'post_tag'),
8 ~- S0 G* e6 G 'menu_icon' => 'dashicons-megaphone',
8 C' z' m: L+ t2 S 'menu_position' => 5,
! z( l' M1 m+ x( m/ i 'rewrite' => array('slug' => 'site-wide-notices')
9 B5 O, p5 x4 R- n( y- ^: D1 r );
8 S O' L6 c/ i: a) d. _$ C$ [0 Y/ [
register_post_type('site-wide-notices', $args);
3 Y; i0 ?2 m$ d% i8 l5 Y/ [5 O }, C8 B3 T/ x6 i4 S
```
4 q- D6 w; Z7 }. G- S; o9 @, ^; G
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
9 Y+ @8 s, u; F, E" ]) A
5 f1 D& L( }1 J" `1 T% H4 }3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:' B+ n/ b8 d7 \2 a8 Y
4 q$ X9 _" i* [6 M) X7 H ```
( r& K- ^* @% u# a7 N8 o* o4 s add_action('add_meta_boxes', 'add_site_wide_notices_boxes');; u; W; y/ C- r
function add_site_wide_notices_boxes() {
; b+ d1 W/ R9 H3 a0 l* B add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');+ _% `4 F3 f6 v
}7 m2 l0 a+ i8 ~4 L$ F
* {; q- c1 x- @- v3 Q
function notice_details_meta_box($post) {
+ P, \ ^$ M" `5 o wp_nonce_field(basename(__FILE__), 'notices_nonce');
, L5 y6 k& J/ i% z $notice_title = get_post_meta($post->ID, 'notice_title', true);6 i. }7 L* H( k2 J O! M4 V$ P
$notice_content = get_post_meta($post->ID, 'notice_content', true);
4 { z6 D: n- D) a; C8 Z7 K8 f ?>5 X% _. \) k* I; S! U
<p>) l5 T/ L, k7 B. z& I) d% g& K
<label for="notice-title">Notice Title</label><br>/ Y: i4 C# N* o' P* M7 P+ N0 C
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">* W* q0 c' N; `: L
</p>
2 c# m# ~0 g4 a$ {, `+ T: P0 U% t <p>
9 N3 S6 |, i3 z8 C <label for="notice-content">Notice Content</label><br>
% o0 P% i+ g, u A& h <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>: B) M; k" t S! b# L' C
</p>8 D" W" B' K# e7 b1 O! K6 h0 ~9 u
<?php
( y' J* Y9 J; |$ X5 } }
" j+ ~, L2 E3 e4 {; q. |4 ?2 q
5 z; v, b( d' i& ^( { add_action('save_post', 'save_site_wide_notice_meta_box'); c4 U& U/ Y- o. H" U
function save_site_wide_notice_meta_box($post_id) {
8 s/ S5 b! g ~. o! `( T; }2 [4 d if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
. C f6 e4 y# @2 o e, v return;
8 x- g6 I0 x) Z' K# B if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)( N) o. l. ?) b5 |3 b8 c* C
return;4 U" v& J& ^( m" ~
/ ?0 }. F2 q/ Q, [
if (isset($_POST['notice_title'])) {
0 u- f7 \1 P6 d- _. u/ C& z3 U4 \7 C update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));1 B4 f3 ]6 s5 Y+ }8 w
}
2 [8 K" K- l' l% v. v if (isset($_POST['notice_content'])) {
2 J5 w; o0 ^! L4 c/ F update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));, ^0 N$ P( A8 ]$ N0 `/ ]& x' }0 n
}5 C% I4 O, @2 q( ?% C2 i
}
L: w" ?/ D" \4 u& l" ~7 \ ```
1 x3 w% k/ u) s! V' t( u$ N
- t- _ ^- F' {9 W 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
9 T# {3 H; B# Q6 n4 Q' Q8 Z/ E
/ f' z8 e0 w' v- J& d' z3 t4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
6 t: Z; ]) r' w8 n% O9 l! K" {& K$ @9 _$ N& o4 k# t3 \
```
3 S8 O: B1 d4 z! S. j $args = array(: \! T' z+ U& N. m5 _. X+ @1 A M
'post_type' => 'site-wide-notices',& _6 h3 P* l3 v# ?3 j# X5 k
'posts_per_page' => 3,- d/ ~5 ?; y4 \! O8 u
'order' => 'DESC',2 f8 A. T) H: S2 s+ |" l
'orderby' => 'date'' r+ T/ a, x' O' C2 n8 l
);
5 a- J7 R6 G( |8 U3 V- o# G0 Z" W5 H $query = new WP_Query($args);
, p5 B, @. B5 i if ($query->have_posts()) :2 F% {1 t+ d! s# v4 Z8 V/ U$ M* j
while ($query->have_posts()) : $query->the_post(); ?>
0 e* @6 u" ]5 V3 `+ x& ]3 P <div class="notice">& H% Y3 {* `0 y$ z1 N, y
<h3><?php the_title(); ?></h3>3 I4 D1 Y9 M& |: b0 Y
<div class="notice-content"><?php the_content(); ?></div>4 }) ~/ J; K. J! ^$ L
</div>
6 j! u6 e( k; v1 F8 p5 F <?php endwhile; _2 j* i6 Q0 u5 ~
wp_reset_postdata();6 n5 ^: M0 G% a7 R; n/ v* U. S
endif;: M3 ^; J! n) r, n
```; X6 ~% B( U5 l3 }
5 W) n- V4 R4 A 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|