|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?+ z" F+ e$ p8 \& H$ C
[% S$ I* J& T) O
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。- o: l: i) t ?* ]3 z
5 g* s3 Z1 |" s3 K. A E3 C
以下是创建自定义插件的步骤:3 ^4 U9 v6 z, \* Y3 d8 M; _* A
+ p# {" U% D! E; S9 |
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
/ J: k4 c; R* D. N0 O
( E4 a+ K/ X k3 u F% w$ b ```7 z4 R. c. d; ^/ f/ R' g
<?php
7 M% q) K" I" T7 d$ Y) x. v /*+ D# b- `9 e# [; Z/ l
Plugin Name: Site Wide Notices Plugin
/ _8 I; O( T0 `$ s5 S Description: Adds a new custom post type for site-wide notices.
4 S' @$ j3 K. |% h Version: 1.04 m6 j8 Y, i4 j9 \5 B
Author: Your Name
+ g o& R) o( _6 }5 B Author URI: http://example.com
& b1 z- {/ a1 H k9 U */
4 }" h& M* l8 b- D! ~1 r+ r5 S# A. F2 u) ?
// Add plugin code here...* J k! h1 V4 h
```
/ F( I2 `/ w) }' C, P" ^, u1 W" k+ y5 k, q
" |3 w% W# {; v9 j 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。; Q& m3 X! |) ~& ^
# X1 l4 q9 x" }4 g R
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
! J6 y- }- R; c5 \. S% s" @& V* L
/ J$ t% i! l0 p0 G# N5 J ```
. C) T1 l- f/ |7 s add_action('init', 'create_custom_post_type');
' m7 r. ^) Q8 T' D1 Z function create_custom_post_type() { s3 C" Q! C4 J3 y1 L8 Y- V
$labels = array(
0 e. u; b5 G" h$ \5 I 'name' => 'Site Wide Notices',
3 n7 f( S8 _! {. Q 'singular_name' => 'Site Wide Notice',
/ F# Y* s) k1 r1 F$ Q) B( N6 ] 'add_new' => 'Add New',! ~+ S+ i3 d% I5 i7 Y8 O
'add_new_item' => 'Add New Site Wide Notice',& X# }9 R" a! [' C) x- R
'edit_item' => 'Edit Site Wide Notice',
6 x+ X( }7 S1 c0 I- O 'new_item' => 'New Site Wide Notice',
; L8 L0 _# M0 c+ h 'view_item' => 'View Site Wide Notice',
. ]4 M! m# T6 ~" ?6 F 'search_items' => 'Search Site Wide Notices',' _ m3 W4 F- d% F8 A v9 [
'not_found' => 'No site-wide notices found',
1 O! T% n6 ~7 ~+ j# W2 ] 'not_found_in_trash' => 'No site-wide notices found in trash'
1 T6 _: _3 w. U) ]& j5 D );
6 Q; R! i7 a6 p" [/ r
w' [- d9 D1 ?$ s2 f $args = array(
7 W$ d- ^; e- ?9 m$ Q+ D& A) ~3 P 'labels' => $labels,
% D! b; h6 U2 h2 I9 @: y D. v 'public' => true,4 E, c. |: C {, B' X- z* J1 J* z
'has_archive' => true,3 B9 L P* l$ k* O
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),# ~. @6 d" [1 Z# M( W4 m: Z
'taxonomies' => array('category', 'post_tag'),) |2 ]4 e: X8 I: r: B
'menu_icon' => 'dashicons-megaphone',9 L2 u% Y7 |3 t6 [% k7 M
'menu_position' => 5,
) n; `! }& Y8 Y3 w4 l7 _9 \; _1 g, C 'rewrite' => array('slug' => 'site-wide-notices')1 d+ }9 k7 Y- b8 L9 a* O% a- f2 T
);- y& s3 ?+ z; A* ?7 \
. C( w( w2 K6 o register_post_type('site-wide-notices', $args);
: H' }+ I' ~! R: A. U; V' |- {' A# d% j$ w }6 A) p1 x3 f2 e( L
```
5 R0 \+ s k4 v6 L/ l/ l9 H9 L1 v
0 a1 G8 g# W8 c" W; ? 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
7 Z: U6 f5 u$ d9 `2 {) \2 ^$ ~: n7 `" C0 j9 M6 c8 V% p. a6 {
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
8 p' @- e9 L" @' `+ f6 H& y0 G c: N
```* x+ ^" |3 V2 {
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
# a1 U. d$ }$ r+ B+ l function add_site_wide_notices_boxes() {
: q! x, x; F) a1 `5 v9 h add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');) U: p1 \! x3 D( j/ O& k7 D
}6 ~9 q3 ]( p" Q- L, @. t
% P. I: `# w* G# l. ^8 Z function notice_details_meta_box($post) {
; J& ^2 r4 Q y0 v% O5 J wp_nonce_field(basename(__FILE__), 'notices_nonce');
% @2 ]$ a" ]4 G8 w6 |# s9 Z3 h $notice_title = get_post_meta($post->ID, 'notice_title', true);
' ~: J# [* |9 |0 X5 ?# T; } $notice_content = get_post_meta($post->ID, 'notice_content', true);
* z. H% X; S# ]9 [) X" f' E3 v ?>2 \5 a/ _' N/ q2 C
<p>/ r: q( `7 [6 r4 ^
<label for="notice-title">Notice Title</label><br>
~* W, e: [( T) R. _4 H t! A. S <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
1 S4 @6 S4 j* q </p>
. R9 o! p9 P5 _2 ^ <p>
5 C4 m2 |; a$ a9 ^$ H9 O) T <label for="notice-content">Notice Content</label><br>
" J, b ~( Y+ X: V! D <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
4 \# v# a: [3 ^5 O; ~ P- @ </p>
. X& R6 g8 m& O <?php9 e6 g* z5 X; ~6 `
}
/ B/ N; P6 E6 C6 \- l' G" Z- _% _# E) W5 R
add_action('save_post', 'save_site_wide_notice_meta_box');* g0 D- `" Q& _4 b' ?) z- }! m# P
function save_site_wide_notice_meta_box($post_id) {
' `8 t" ] B! r1 Y' g* G if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))9 I x7 j- ~4 K! {* K2 m( Q# ~
return;
& ?# C3 C* _& ?6 S. V [& q if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
& w& L3 h# ]( N [2 m$ H' b, a/ s return;
7 [$ ]. r! U9 f! C3 C
; D+ q( v6 s9 }$ p8 s( d# A if (isset($_POST['notice_title'])) {, W9 b7 W( k+ I q
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));7 q4 h3 {2 c- M/ g+ E: w
}0 s9 I, X; l- K, k9 j( l
if (isset($_POST['notice_content'])) {
( u( [1 B) I& }4 |9 m! e9 k update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));7 o. b% \6 L8 l7 l6 |1 {
}2 x6 z' P2 o) `9 `
}
2 Y1 F1 g- x# M6 w ```% _' X6 d" Z( }% O7 I) [
}' U9 O4 O! p! _7 b) l 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
i l5 e7 z' _! i, {1 V% D
# S- f' c6 a( d! E9 s4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
" h# \$ j* [4 s& H0 w6 w* d* n. C3 J d
```1 N3 I' f6 D! f$ ]! ]- k1 M
$args = array(: i0 y$ Y5 H& N( h4 U( z7 w" Z
'post_type' => 'site-wide-notices',
2 ^& _8 X" Q, U7 h. l 'posts_per_page' => 3,8 v5 o! B0 p) D! q& G1 }! B R' u
'order' => 'DESC',' S* r. p7 m/ G" o9 h4 e
'orderby' => 'date'. N: @0 W$ G2 H/ S* B% ?# f3 o `
);
5 K% h" r# O% n& w5 \. ~ $query = new WP_Query($args);
$ B: {. Z8 e1 b8 t' x2 c, f if ($query->have_posts()) :
2 n7 R3 L( p$ B+ j" M4 K$ V while ($query->have_posts()) : $query->the_post(); ?>
/ U- t& p B: d' u3 u1 O <div class="notice">
3 k- g0 }; f' Q& ^ <h3><?php the_title(); ?></h3>. R0 {: i6 y. \# j8 q9 z* n9 d& O
<div class="notice-content"><?php the_content(); ?></div>1 |2 P! E' z& t) N' o3 k
</div>6 l0 K7 Y* v; m: t
<?php endwhile;9 I H( Q- ~# i( z) f
wp_reset_postdata();
1 y7 E* C, T6 {+ K4 M) D q5 Q; R( e endif;: J$ U4 {4 q+ Y$ d! _4 a; L+ c$ k7 a
```% v( m) Z0 g; A1 u$ T
H$ N5 G9 e7 w5 y' X2 P# }1 g
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|