|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?( Z7 j2 W3 n6 B7 [) N/ x6 z2 t. A/ ?
) ]1 Y: Z- _5 {4 t+ Y: b
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。6 q+ c! f+ V9 x
3 ~2 [1 u' ]9 s: K, \0 U7 t5 Z: q
以下是创建自定义插件的步骤:0 r; W5 l8 D! J: F
1 Y% j3 z' o' x- O
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:+ h, C2 f4 [2 g9 R
6 ~* R7 Y1 U. u) v: K, v( `$ ~0 y
```2 Q1 T- a8 A, _( ?% d
<?php
* v+ V( \0 V3 [ F /*: J% x1 b% |( T ^3 w
Plugin Name: Site Wide Notices Plugin }! h v+ ?& _& A3 [3 q
Description: Adds a new custom post type for site-wide notices./ f. w' [% w/ r; y
Version: 1.06 m8 G6 D( y$ s% E9 j" H
Author: Your Name
% @2 _ H2 v; i3 [& S$ D Author URI: http://example.com$ z0 \' F' O, V) h! }
*/
! `! X1 M, g r7 R# }% K% L8 Q" k( G! F3 h1 @2 f, ^3 E
// Add plugin code here...
2 E4 G# X; W/ J7 g; n* ` ```
" R$ ]: \5 I& C! U( ?. h8 U( m3 f% J9 m2 P5 ]
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
7 H) I. l% X H9 H% E. z9 ~, O9 I6 d b7 e9 @/ e) l
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:+ k6 Y6 e9 b& `+ _6 d2 x# Y0 E
1 d5 i- p( J/ W/ u ```
5 X# A h2 ~/ K7 D$ Q add_action('init', 'create_custom_post_type');
8 B) L' R2 G9 K9 L function create_custom_post_type() {$ A L) c$ L& ?$ v L
$labels = array(
$ T1 y% X( u* `# n 'name' => 'Site Wide Notices',
* U* Q9 a( n1 U8 D1 a 'singular_name' => 'Site Wide Notice',
; Y: g6 n2 X. T+ |, @ 'add_new' => 'Add New',8 m( L+ }, J/ m- c- I$ |
'add_new_item' => 'Add New Site Wide Notice',
) O1 u$ {; x1 J& _( @ 'edit_item' => 'Edit Site Wide Notice',
! E! c% i( E$ v0 N2 H 'new_item' => 'New Site Wide Notice',
; H2 L3 t& J! R0 Z( N- n 'view_item' => 'View Site Wide Notice',6 j8 @$ ^( C" t1 s" d" k
'search_items' => 'Search Site Wide Notices',
D: n. }7 I+ U: P3 f( C 'not_found' => 'No site-wide notices found',
* ]( ^: _0 N% s- Z& H, U/ r0 y 'not_found_in_trash' => 'No site-wide notices found in trash'% ~7 y: ^2 N8 q; o7 g
);+ n9 B& A# I, c% S" V1 i
4 Y( ~9 A* h* y) w6 K" H4 A
$args = array(
6 u7 H& R5 z* k. c. O( u 'labels' => $labels,4 ?- K2 T8 Z1 [- a/ G
'public' => true,* ? W7 H) r8 h' R, [; q* b
'has_archive' => true,
& T* {3 g0 O5 _# s 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
: `2 e, X7 r' @0 @& P/ U$ t1 x 'taxonomies' => array('category', 'post_tag'),
) ^# o4 }$ m( Z- S6 w/ ]) S( A: z 'menu_icon' => 'dashicons-megaphone',( U4 k( a7 @6 B5 j6 |7 G/ z) Y
'menu_position' => 5,
& o" O6 } j1 f# ~# C6 w 'rewrite' => array('slug' => 'site-wide-notices') ~2 ]2 S, B9 }% @( N6 u
);
@7 y! z% y `; L: h6 \3 I
' s- O& K# ~, [8 U( Q' g$ H register_post_type('site-wide-notices', $args);
9 u# p; ?/ |5 e' J( Y }
( \& c9 P0 L! @ t# ~ ```
, Q- v4 x4 A7 S' d9 R9 i
( l- J; |% o& h4 R Z 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
! N+ I! y* V$ K) t3 y
: h* Q* e2 ]1 |8 N7 C3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:& O6 z2 R! H3 d
& T2 g, C, M% Q% y0 W) q
```
* e+ V1 J9 G4 d, Y add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
: \1 ?! j4 h; A, q: u function add_site_wide_notices_boxes() {$ T) I6 S+ Z: z: M: C5 r
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
4 e: V& m3 D. S* Z5 B0 S }
0 C4 Q# n) T3 ?& v7 s1 i4 p
3 D% I( q" N4 a3 E: g4 | function notice_details_meta_box($post) {7 [3 E* Q( \' Z `( R
wp_nonce_field(basename(__FILE__), 'notices_nonce');
0 y; v4 U; k, \1 H4 ] $notice_title = get_post_meta($post->ID, 'notice_title', true);
; A4 ` X) z7 @1 D1 s $notice_content = get_post_meta($post->ID, 'notice_content', true);
8 M8 r/ v: C( a- }, [& T- ^' a# s ?>
6 J$ w/ U+ {7 k, n* `3 O4 D <p>
4 p1 q$ J9 p$ E5 S, t+ b. p <label for="notice-title">Notice Title</label><br>: N. J. X, c& ^1 |2 S' ?) \
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"> ?2 \7 k0 y" b* W/ M
</p>2 G, h8 H! t) l& o1 ?/ ] J7 f9 v
<p>
; u r* X) }+ ?2 G) Y1 J <label for="notice-content">Notice Content</label><br>
# \5 Z) ?0 W3 t <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>' P& S4 b3 F3 ~, ?8 n
</p>
! j4 S: K2 V7 s( z4 R2 ~2 S% F <?php, d8 h4 U5 J; H% P i5 m+ S
}8 a0 h* Q: }' {6 U6 Z
) \. r+ | @! ]& a0 v; @7 N
add_action('save_post', 'save_site_wide_notice_meta_box');1 G) U8 `5 |; ], v3 X' e7 d5 q
function save_site_wide_notice_meta_box($post_id) {; B/ I, u( A' G( E2 `
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))' y" y: X* S7 }0 N7 ]* {
return;
% l$ q* M0 R9 @: J if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)1 T, l) ?' j! E+ A2 m; N; j
return;7 D3 x* J8 }" b
* X, F; G$ v( S/ M: T if (isset($_POST['notice_title'])) {0 S! `% V, Q! p
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
0 x8 E+ g, i3 d }
$ J7 @ y' [: Z9 o4 q/ u! h if (isset($_POST['notice_content'])) {! f8 [5 m1 _: r0 J2 `" h
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
0 }7 }# s: ^6 L$ y3 Z( Y9 N5 \9 z9 X }( H; D; S4 C2 x& h! d
}. R! @) q2 r4 u" m/ {) c6 z- l
```
. a- p% ?* t. L& o( C" r4 I' o+ l/ T" f( j/ S, h8 k3 i
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。( R* v% Z. s9 Y. Q) g) r
5 Y( z" V$ z2 a0 i4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:! v6 A& K. J# L- a' [9 i
- Y8 w# W, @7 \: B& ` ```
, g+ W- g, K+ B $args = array(! _8 l: W+ s- Z. J& @# J
'post_type' => 'site-wide-notices',
( ?; i) Q4 q2 R* v( Z7 u, f2 c% @ 'posts_per_page' => 3,. v% l# S* h; {1 s0 f
'order' => 'DESC',& n8 R+ r; C) D. G
'orderby' => 'date'' y7 [+ h) K! L1 a6 f$ Q: @7 `. T
);
' R1 s+ b9 i& B+ {6 W3 f, [) o $query = new WP_Query($args);
3 @( J, x" q, y& p if ($query->have_posts()) :
0 E1 _& b! ~5 R; _% }$ q while ($query->have_posts()) : $query->the_post(); ?>0 r L7 B4 r- V1 L Q4 J
<div class="notice">2 J& i( W1 `# d
<h3><?php the_title(); ?></h3>$ w" p- I% }- v/ W* h7 d3 ^
<div class="notice-content"><?php the_content(); ?></div>4 L5 t/ D5 ^# K% i2 ]
</div>
: n! y/ |) h2 @5 A; A <?php endwhile;# N' C' k% H+ P; ~" f2 A
wp_reset_postdata();1 K: H/ c( E# ]
endif;/ L& Y# o1 O, s4 w9 b, b$ v
```' t8 C. X2 p' a3 o
; H. b5 {1 b* ?% ~ J+ |2 ~- w
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|