|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
; j4 u7 L. x { h6 b4 h1 j: ]! c7 P& N
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。8 I2 l+ q# c `: H( K$ K$ r. d
8 B7 Q- I+ Q, j% N8 W* X# i以下是创建自定义插件的步骤:
) `) _ t. T6 @4 v/ p, U, q! m6 ^+ i8 f2 m. Y- C; Y' N. U
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:- w1 `' u+ z: ?5 b# a
7 a0 Q0 C- |. ]6 }3 u" m, h
```
' ]+ Q o: t+ x+ l <?php
' D) k* C8 h3 O% P% x7 e /*
6 K' y* `- O# v% H7 H- x& y Plugin Name: Site Wide Notices Plugin. K9 x( ^$ p: E' {/ K: b
Description: Adds a new custom post type for site-wide notices.
5 I+ H2 M4 S I' Q Version: 1.0
6 k, Z q' h; E; { Author: Your Name
y- K7 [6 b; f6 [" g Author URI: http://example.com
+ h' o$ z( R6 F( _ */+ R2 B" j( Z# o: d9 v, Y
2 b% y# {4 D& z+ q! k9 [3 z) { // Add plugin code here...
, e' |3 Z7 j( X" Y: O ```
& O( [% C* J$ n. }/ I4 j
4 h1 U1 q& x9 i: ` 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。- T0 Q N' h4 z8 J/ g1 b
( y6 U% X- E- A% {
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:# }) o# I2 I; D5 L0 N
, ?- X$ i- x, s" Q @ ```( S! F: w) V) R/ E: Z: P$ B0 ~
add_action('init', 'create_custom_post_type');
' e n7 D# W6 o' ^4 l/ n/ ?% b. y5 F function create_custom_post_type() {
( w# J3 a% O! s$ Y+ K7 a0 U $labels = array(* j) x- E1 F+ _" q5 S' R4 ]
'name' => 'Site Wide Notices',( R. O$ }$ \. `) M! ~
'singular_name' => 'Site Wide Notice',9 Y0 o4 z" C2 q3 t* Z, a
'add_new' => 'Add New',
4 F ^5 y+ P( K 'add_new_item' => 'Add New Site Wide Notice',- C% _. B, e/ v$ L$ X+ a7 H
'edit_item' => 'Edit Site Wide Notice',+ _4 G P* M3 G
'new_item' => 'New Site Wide Notice',1 z3 o, I5 U8 Q" i( ^1 \
'view_item' => 'View Site Wide Notice',6 P4 V$ D4 ]9 \
'search_items' => 'Search Site Wide Notices',
1 c b: A3 ^1 [+ [ 'not_found' => 'No site-wide notices found',4 _4 Q% l y- ], g
'not_found_in_trash' => 'No site-wide notices found in trash'2 J' v% W3 h5 c* M3 a
);
$ s( k4 x& u' t3 a" a3 D
, A& C+ x. ~ H% G $args = array(
o* S; w1 e% s 'labels' => $labels,- [9 ^3 z' A2 S9 p: \" S
'public' => true,0 w# i; u4 s# n4 L1 l0 M( _- Y: P
'has_archive' => true,
; t: \3 q/ i7 u. P' } 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
% L. ?# S* r7 X& n5 _ 'taxonomies' => array('category', 'post_tag'),
* o- A5 L# O7 c Y' Q 'menu_icon' => 'dashicons-megaphone',
6 L5 X# e0 W1 h l6 @$ {% ? 'menu_position' => 5,
# t: e) Z$ O4 V5 s) F" ^ 'rewrite' => array('slug' => 'site-wide-notices')% z( r2 l6 q8 j6 Y+ b" H+ h# `* v
);
- G4 q/ P- f3 H0 ?) A0 j
1 b/ w! {) J( a/ W# v register_post_type('site-wide-notices', $args);
" Y# w! p0 V2 R4 [0 Q1 w }. B( h8 k4 V# Y" t
```/ W+ Q# s4 s! _ F7 L. q3 {; m
3 d9 {& Q! E8 m) S 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
/ R, j/ O" z1 o/ c7 G) o) e9 h5 O: _
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
+ `; v! V; I6 A8 r/ W3 g
& T# R; y8 e$ t3 S, K, N ```' }9 w& g3 X' ]
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');$ j8 c' W* J' E: A+ ]8 k) x3 I
function add_site_wide_notices_boxes() {
b9 Q1 v* Q% ]$ i' q, Z add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
8 l4 I0 u% I9 G; w0 i: U }& a# z C9 Q6 L/ z% B
# G. l8 W8 F" R6 j9 l4 O
function notice_details_meta_box($post) {
. \: E* J+ A) u0 {/ a6 Y- K( X$ { wp_nonce_field(basename(__FILE__), 'notices_nonce');' r/ ^3 Y- | l; T
$notice_title = get_post_meta($post->ID, 'notice_title', true);
2 ], u8 c1 }0 Y+ |$ X $notice_content = get_post_meta($post->ID, 'notice_content', true);
, T/ d4 w" _" j ?>
! |2 b/ ~' c) ? <p>+ o5 N) o+ e2 H X4 W6 B
<label for="notice-title">Notice Title</label><br>
- `, {/ v+ \* U, } <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">8 U5 i! Z* T; l. Z0 L, X
</p>
* i* g3 K: ]2 d. _ u: Y <p>
+ P# P2 n0 L% ~" T <label for="notice-content">Notice Content</label><br>! K- c: i7 _/ c$ b
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>6 R6 @8 `* I% A. W% F/ [
</p>
$ K4 V5 {0 J( ~- L0 `& Q <?php) \% R' T4 m7 N8 q. z- J
}
# _: u" v# M7 T* g! v8 A! V; y0 L6 b! L% }1 [: U
add_action('save_post', 'save_site_wide_notice_meta_box');
2 V5 C0 f* W7 M) c function save_site_wide_notice_meta_box($post_id) {; a" n* S% n0 a' h2 u& x9 d
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))); J! z; n" k& {7 W. E. W
return;
$ l4 i$ |- @0 I n/ w4 [8 p Q& i! x. I if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)6 k* [# W1 X- c h3 R; n' p2 c
return;
5 S: L: c0 k: F" B, _' ?, K) s* M E3 H1 e
if (isset($_POST['notice_title'])) {- g) M5 N% R" ? @+ Y; S5 }
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));; w+ S; k- a, s* H
}
/ l! {3 I+ {$ K: `; T/ O8 W( n if (isset($_POST['notice_content'])) {9 g y: u4 V+ l' E+ v7 A! s
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
/ W' R1 k3 i/ {7 J }
y8 f" x( M3 V* `% S9 N, v }
7 H/ p- M8 v6 I/ B( t0 }7 R ```$ d2 d2 a- f7 t6 H G9 g
- I4 U0 u2 k7 R
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
1 G/ Z( \7 h% |8 x7 I7 @; {: y [' _7 u, A1 h7 A/ L+ b
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:" X# ]( w: q' }5 O; m8 c$ C( A6 e
2 l7 Z. x* S1 ]+ z4 k
```
* r1 y f, r7 d4 G& u0 q; P $args = array(
# r" G8 r( l0 b5 d. E6 O 'post_type' => 'site-wide-notices',
[) y( \" p% M; a5 T( w) s. j 'posts_per_page' => 3,
2 F( M3 R ?% |- N: l# J 'order' => 'DESC',
3 l! ], z! P- W% D( B# i 'orderby' => 'date'4 T8 l5 H4 \1 v( p9 d3 H
);1 ~6 A! x" q. W" _) j2 f
$query = new WP_Query($args);( b- \- ^$ B' C) j1 O; j5 ~1 N
if ($query->have_posts()) :5 a$ N9 F/ u! r/ F$ E" Q
while ($query->have_posts()) : $query->the_post(); ?>: G" E; a7 Y+ k
<div class="notice">
& T( H5 H! F+ X* E1 j <h3><?php the_title(); ?></h3>
4 v) @$ p+ @& w1 L <div class="notice-content"><?php the_content(); ?></div>
! O9 s* T* r3 K z1 h6 b </div>
4 r0 S! R' y2 U, s7 W <?php endwhile;
8 @3 u: t& z8 W* P. ~ wp_reset_postdata();
3 W! m' O" K' \, a, A# Z% q/ W endif;4 C u( |5 I$ I& f$ m+ x# Y
```: G3 |/ J& _ ? T
$ ]% w$ h, y2 y 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|