|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?9 a" C5 N7 _" v; X) b
" ?; ?) S( w1 U如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。8 H+ f8 `& N( P( k f6 V6 c' Z8 s4 {
7 I' s& C/ U6 S以下是创建自定义插件的步骤:
0 H: X, A. g0 `# w( R) ^2 t" L- x/ R( N
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
2 [; a3 X2 C0 `2 S5 f" Y9 W! |) r5 c6 A3 b; { F8 y/ x3 U
```6 X' \. X7 Q H4 m# a# i" F( ^
<?php
3 [: m" G$ I" y) H& m+ R /*
+ q t+ s$ I9 P. b: d: Q Plugin Name: Site Wide Notices Plugin
5 N8 A+ x! P+ D! M7 w8 k7 s1 u Description: Adds a new custom post type for site-wide notices.4 V: u1 r9 H( m* r- s3 ?0 W3 Z
Version: 1.0
" B4 ^/ w9 i6 h, F# ]0 t Author: Your Name
C. h7 J6 t2 M+ i! i) q4 a5 f Author URI: http://example.com' X4 l% B8 i3 j. `0 X1 t% T' Q8 ~3 N
*/
2 g& O; G/ a4 y: S: M* r- ~+ s% ~+ u) ^( f3 z! u
// Add plugin code here...
/ G& o( |/ X4 D: n, |0 Z ```
% Z* u a, v- j/ ~( ^8 a! Z7 C i2 R2 {/ k( d
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。2 X4 \0 v8 z% T; u1 Q6 Y
: l* a1 @) m* U2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:: Q3 z% q; P4 C- E' G7 N3 U
{) j/ E: U& T( m; G; C
```
1 [/ E/ a8 \# N" X% R& }8 U; O add_action('init', 'create_custom_post_type');5 I+ ?4 ^) q, G- c8 b. W! v
function create_custom_post_type() {# r2 c+ i- J0 ~( E5 Y4 W! y# S
$labels = array(
' m0 ]; _- i K4 r 'name' => 'Site Wide Notices',
+ |" f6 L' w& S, d4 n 'singular_name' => 'Site Wide Notice',. b$ T, b' a6 [6 x @/ q: _3 y: v
'add_new' => 'Add New',
L4 [6 v% D% S* { 'add_new_item' => 'Add New Site Wide Notice',
6 {0 H# x% X# S) x7 i( `- n 'edit_item' => 'Edit Site Wide Notice',
& ?1 i2 F5 c7 ]5 Z- l' b 'new_item' => 'New Site Wide Notice',
" e8 ^; R9 l& k4 s/ b2 r 'view_item' => 'View Site Wide Notice',8 q3 s* ^) t+ V3 c5 p
'search_items' => 'Search Site Wide Notices',/ y. H9 l6 R+ ~1 b3 c
'not_found' => 'No site-wide notices found',! g7 d* @/ z. c2 a1 O* K1 |
'not_found_in_trash' => 'No site-wide notices found in trash'9 o2 a9 v5 m2 o% H+ K2 T
);
6 c( Q [& K! D2 ~
$ O1 C) n- S! o; A) Z- t Q $args = array(* |! K3 f+ R1 `- Q2 r0 E* Y
'labels' => $labels,
; ^1 d& I/ x6 m' P 'public' => true,
' m; [$ C+ L1 e! I) ?2 O; t 'has_archive' => true,
& n) M V$ C, H; s v 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),1 I2 Q2 C2 k' o
'taxonomies' => array('category', 'post_tag'),
- [ e7 x! m' I b7 S 'menu_icon' => 'dashicons-megaphone',
. U0 g3 U: t1 H! O* A& L2 D 'menu_position' => 5,
) m9 o8 _. t- {1 a3 w$ e 'rewrite' => array('slug' => 'site-wide-notices') P* V4 E w; i8 v
);
3 u( Y; q: G9 H0 y7 ^; @) R( e1 m% R3 i, M' q
register_post_type('site-wide-notices', $args);# B: Q D9 E+ @3 J2 s, `5 p" w1 N9 e% N: W
}1 ^9 p8 {* P( E' R! @
```1 ]# m$ l- Z4 X& F: A" ]
d# G/ y5 C& u. `% z) l% R 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。9 ^$ w9 W0 u [* [0 E3 Z! f
2 y; K9 w. _8 q6 U2 k" N4 G3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:% w. U7 @0 x4 V6 i% y
9 p9 t! y) u) ]' P- v
```5 ]2 M8 b# J* ]* Z! E
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');" I9 n% W( U) i6 X0 x9 C: g
function add_site_wide_notices_boxes() {
! k5 Q2 X2 d0 N/ [ add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');$ t) D; B/ q$ @7 N# Z4 W2 ^# Z6 r
}
, s; F" o3 O* }0 o1 y( m
1 U# M& @2 D6 f7 e; O% c; t function notice_details_meta_box($post) {
$ C% p& l' A& K6 w% U) B2 J x wp_nonce_field(basename(__FILE__), 'notices_nonce');9 L6 `' u) o' z* N
$notice_title = get_post_meta($post->ID, 'notice_title', true);
! z/ H$ Z+ z. m2 y. X $notice_content = get_post_meta($post->ID, 'notice_content', true);; C5 Q) {0 h5 K: P" j2 Y3 R2 [0 U
?>
7 x; R4 R2 j2 H- h4 N3 x <p>
" h$ ]1 i; |0 D; q; f9 n <label for="notice-title">Notice Title</label><br>
& K, Z: T+ N- |7 q a4 g& C <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
! b& ]. R% ^8 s" b2 [ D </p>$ ]$ H: n( j% p0 M; A
<p>7 D5 L- d+ a" ]% Y0 T* b& ~7 p, Z* M
<label for="notice-content">Notice Content</label><br>( G! [ t8 r( _/ x( ~$ W
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
& c+ u8 b5 }6 E: s </p>
* D$ \1 T4 d% M$ G/ y( H <?php3 I# X& O8 X4 T& N) s' f
}
# `, |3 H8 E9 y! l6 \9 L
( ?# C' n* r5 _ add_action('save_post', 'save_site_wide_notice_meta_box'); @7 U N& Z, `* h6 s" e
function save_site_wide_notice_meta_box($post_id) {
! m+ A/ S* M g9 `/ u if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))! N t- E" E: e9 d3 t' L1 S6 k
return;
5 i5 u* D, x$ N- x8 e if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)* b0 s. b3 J9 O
return;3 C; B6 Q; T+ n9 a9 r
" `% k6 @ P9 q; E+ A if (isset($_POST['notice_title'])) {! _) n, o8 ^% {0 e
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
. T! w# e; i u- ] }
- [9 d. W( y1 Y( _; g if (isset($_POST['notice_content'])) {
' f6 ~( a( ~' `3 F# l- U update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));% K3 N3 f% w4 ~5 G( h, \7 F3 ^/ R
}
# F$ N7 s" N4 K8 s+ S; k" r }6 X! ~; R- N2 K7 J6 ]
```
7 G& U% K. p' M5 a( _( T8 [6 U$ Q, p6 v: U; i
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
7 a7 _8 ^3 N3 g" Z& P; r: ?# `! y# \4 V. l8 V& B' K( f
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
; q9 V# f5 Q; F9 M. ~9 C
2 ^- c7 Z" S. K+ ?+ G4 Y ```
. @9 W4 ?" K9 C" u2 y+ E0 L $args = array(
V' j5 E0 v$ q+ \) S$ {+ L 'post_type' => 'site-wide-notices',* q- F8 q8 j3 D' ]: }2 V$ a
'posts_per_page' => 3,# }. B6 ^; C b3 M: O6 F; J
'order' => 'DESC',
0 |( A- k3 Z+ n1 @/ p 'orderby' => 'date'
! K, ?& M ?1 E) w );% }$ B d1 ~$ W
$query = new WP_Query($args);- Y* [4 J. o2 U8 q2 s
if ($query->have_posts()) :
# a. y5 X* A4 @$ C( l' e while ($query->have_posts()) : $query->the_post(); ?>
& G# t; @3 \7 }9 B" g8 [6 R* u <div class="notice">7 q7 I8 k- P9 J/ y
<h3><?php the_title(); ?></h3>
% o7 Q& F6 m1 a+ O J5 N- M1 W4 Q <div class="notice-content"><?php the_content(); ?></div>" }$ }( u& x" h7 w# C) g
</div>
2 O+ y! ]& y3 J' j2 J/ m- b <?php endwhile; X: k. u2 D' H+ I8 S6 T
wp_reset_postdata();
: j0 @) C2 n- q0 I. [4 _- } endif;
! ~$ V( ]1 u, e7 } ```
5 t! e# R, c! v# Q, A' v8 |2 d1 e9 }: Z
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|