|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?$ v; A r& w% y3 N- s+ D! m" G
$ _$ x$ M5 [' j# i1 \, P4 h如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。: m7 ?3 x. {( K8 Y
0 v+ x0 Z7 O% }( H0 r
以下是创建自定义插件的步骤:
0 d! K% X9 P/ p3 o, l! r% B1 _% v( Q! F# O5 Z* J; k
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
' h! n* r1 h& h/ @3 m" m7 z- Y" Y4 S8 S2 t; E
```
9 x H- L1 [! I* F <?php
% x3 M9 @/ R% P0 N% b /*
2 z+ ^; O# U x/ k) P4 y/ s Plugin Name: Site Wide Notices Plugin1 X$ p; h8 Q& p3 W8 |" [$ G
Description: Adds a new custom post type for site-wide notices.
- C0 x' e F' x; X n# ^6 T: L Version: 1.0
( q1 d# b. v& ? Author: Your Name
" F V! N' }, A. |6 C( [, q Author URI: http://example.com; H/ i" X; O. J% a
*/
# w8 T# x( _6 I) K% K" V+ D) }
) ^+ z. _0 b- h4 Q. O' w // Add plugin code here...! ~8 ?7 \# s. p: G+ w! C
```" `/ X9 N" m( [" W
% A' q% u9 o& o& f 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。4 b% X. Z5 T/ y+ y" M2 H% T5 h
' N" | I( J' l/ W* A2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:3 }7 o0 `; b+ I( s
3 {8 v4 G. B4 x# ~8 O" t- h" s ```2 t9 r2 _" V) l! C8 U
add_action('init', 'create_custom_post_type');* y! \* r& ~- Y! ~8 U1 T" m, g
function create_custom_post_type() {) Y* B5 z8 T D" I! _7 Y
$labels = array(6 \1 A" ?: G4 D- }+ }; U* F
'name' => 'Site Wide Notices',
4 {- D$ \+ H& P7 d4 v# h2 W 'singular_name' => 'Site Wide Notice',/ A, y; @1 L- Y! y& J7 n
'add_new' => 'Add New',# B1 o$ q# }7 l9 \! |
'add_new_item' => 'Add New Site Wide Notice',6 ~/ l x. P/ j% e5 Z5 a! P
'edit_item' => 'Edit Site Wide Notice',& P P: p: [* ~4 d* ~9 E
'new_item' => 'New Site Wide Notice',
6 E7 G% y6 h ~! J3 O3 Y 'view_item' => 'View Site Wide Notice',0 w7 @& S2 [+ ~2 G) t5 \
'search_items' => 'Search Site Wide Notices',( m! |4 |2 x" s7 o/ q g
'not_found' => 'No site-wide notices found',
3 y( @: W' N8 v 'not_found_in_trash' => 'No site-wide notices found in trash'3 T, e# j" p, ?- h G+ Y7 @
);
; J9 R9 T4 n+ ?& N; [6 U8 v" n k: Z! `2 L6 p) a" \
$args = array(! D. D9 b; {9 R( p5 {
'labels' => $labels,3 |+ F; |4 M+ @& w9 `
'public' => true,: v! H$ ]0 }2 c2 T- h* o$ J9 E
'has_archive' => true,6 j+ T% y5 ^# S: b) y% w t; F$ u2 t
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
9 N8 b# k" H# s+ p. p 'taxonomies' => array('category', 'post_tag'),* n c6 a% p0 r4 E' M# o S' }
'menu_icon' => 'dashicons-megaphone',0 H& \7 ]8 @4 A' ?3 x5 c6 E- c9 r6 x
'menu_position' => 5,; @2 [& l- }% U/ A. ^% I
'rewrite' => array('slug' => 'site-wide-notices')
$ I% X8 ~! Q5 Y0 g' x );
6 j V2 @" }4 U* }' O5 F ~% Z$ O5 J; k( t8 Q- a, ~* ~1 D, g; t! f
register_post_type('site-wide-notices', $args);
; B6 W5 j/ t W+ O+ D2 w }0 F% S( c$ `/ C. Z) T
```
* z1 H) s+ \9 ~$ E: } E0 H' ]
9 ]+ ~* }" d* t9 x/ S0 @ 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
. r% e: C7 q* v4 p
! d+ f1 z% @0 T3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
2 m" e2 \4 n6 A) S+ a7 f6 F6 \8 {( x u1 C* A# t6 b1 B n
```
1 p* l5 p, `! t+ R2 s- }, E add_action('add_meta_boxes', 'add_site_wide_notices_boxes');/ E+ G* L. \- Y; W! [( `
function add_site_wide_notices_boxes() {
0 m" G3 J6 e- O7 C# ^ add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
5 [4 h( T f* ]' a, t }' b, y$ l" Z* `
/ J* {4 S' ]+ L3 [7 t& _: H function notice_details_meta_box($post) {* o& G: e1 e' U9 t9 _0 Y, {
wp_nonce_field(basename(__FILE__), 'notices_nonce');! W8 M" E$ r* O, g3 a; ^1 Q. |
$notice_title = get_post_meta($post->ID, 'notice_title', true);: B. y3 g1 F( M+ C
$notice_content = get_post_meta($post->ID, 'notice_content', true);5 Z% c, }( Z. N B5 G
?>
, F% r4 `- E' O$ d3 p4 U, @$ N6 X <p>( V2 t& o! b, Y! ^
<label for="notice-title">Notice Title</label><br>4 Q& H9 r% `! G+ d% a2 b# k
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
$ O; E& s+ e" _ </p>
% ?0 S! B) Y6 S2 |% {8 y! }, D! h <p>: H" K' `" F1 }* v
<label for="notice-content">Notice Content</label><br>" W. B( C+ H' Q8 o1 N1 ~
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>0 k' @7 Q u; N/ y- n
</p>
) k! V& E: g1 R <?php; P' n0 @* ], T! n. L
}
5 ^2 B0 p2 j5 D5 S1 m6 f; `3 D. F8 o% Y. N* v# x7 p
add_action('save_post', 'save_site_wide_notice_meta_box');4 P, V0 O8 m3 j' t1 @
function save_site_wide_notice_meta_box($post_id) {
, k3 Z- j; Q0 I) ?! m if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
# w& j" \- l) m; T3 D% S return;9 a' m* y* V S5 _& ~3 t
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
0 X* W3 G& d/ c$ ~! h return;
! @+ m; n/ ]' g/ _" X$ n/ j4 _, X, E1 J# k' a# r4 X6 ?8 r
if (isset($_POST['notice_title'])) {2 h; |8 J5 z8 |6 N% R4 i$ `
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
2 {; f% p2 L1 M3 }- s" a }
( e8 S e! ?( N. _9 M1 y if (isset($_POST['notice_content'])) {
# `! }* O2 U& v4 h update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
& N( h% f1 \) X; e+ o }
8 r/ q: M/ @4 O }' ~0 K' a; F) X! A7 F
```# Q$ h, _8 e0 a9 g: @3 w: n
2 ^9 J; L/ Z+ G7 d8 B- K* I# l
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。0 e) ^2 d- A- f5 M
7 F- M; f% {+ U
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:1 \( q( p( @7 ^8 [
. @; g6 H9 Y- n- ]( c. x ```
7 D% b' p% a4 X# n& j) ?4 q $args = array(! v0 e4 I! U3 e3 u# Z4 _8 ?0 d, w
'post_type' => 'site-wide-notices',8 D6 v$ G" R- }, s( I) w- H# b1 N( C
'posts_per_page' => 3,$ k# ]! [6 p& n) N
'order' => 'DESC',
7 h0 C" w6 m' S: a! Z0 U 'orderby' => 'date'8 {7 T6 G+ N. u
);
( u$ l+ Q# q6 ~" l) x $query = new WP_Query($args);; V) W) q9 E3 R! y+ L+ j
if ($query->have_posts()) :; s! h/ I3 e" q1 A. }
while ($query->have_posts()) : $query->the_post(); ?>" t% m: Z8 o2 Y3 m
<div class="notice"># N) c" q K4 g P8 |6 m! [% X
<h3><?php the_title(); ?></h3>
% v) X A+ M/ S2 H/ A# O4 A <div class="notice-content"><?php the_content(); ?></div>8 M) f4 c, j& z+ |( S7 D7 i' R
</div>! @% y0 f. t5 R
<?php endwhile;
1 q1 ?% J7 f$ l, x; B wp_reset_postdata();) L6 f! o3 w- T% S6 O
endif;+ Z; r7 |" E$ u
```
9 S5 z. M R! w) b
* N7 E- l. e! K9 o2 K/ a 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|