|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
- K& y1 r+ f& J1 w2 L! P
6 ?! u* L& M* n+ \如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。- s& T J9 m/ U j. Y! j' @4 j
" F% N. j5 T, z- v2 N. s6 L) a7 Q+ H
以下是创建自定义插件的步骤:4 ]' y) u# J, t6 W( j) B6 X
+ J. i- c- d7 b8 x$ R
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
8 ^ ?. x5 K( b% R$ s- H' I; Q" H! o; Z( W7 B
```: n# X1 ^+ @" N4 B% R+ q% Y
<?php& L- f! m1 w! g( m3 [: [
/*! G: G" g, e, G* b7 O4 r& N
Plugin Name: Site Wide Notices Plugin1 s6 o" P: t# P# D8 X7 D6 _
Description: Adds a new custom post type for site-wide notices.
3 f% T& k1 h) B7 k, j8 Z7 f7 z# _! m! c Version: 1.0# j/ h0 @: c" ?" ]8 }1 V
Author: Your Name
% a1 T, b" {6 q Z* t- Z Author URI: http://example.com
, P) ~& h4 R& j0 _, k */5 [, ^$ q) R, h( c( t- f/ V, d
& v( J2 ^- P6 n" h2 }
// Add plugin code here... P. ]* z3 j: ]( B7 a- p
```. k0 L0 M1 Z" j) F# A# _
2 Z# c; A# o6 F1 p. x2 N/ p8 d8 T
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。 [: e# T1 T3 e; q& t! q
$ {: G& f2 [+ r9 b' ~ `6 j. B
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
& J" \- ]; x" O3 o) w0 G" W$ a9 b
& d! k! Q9 {$ j, |& c, g ```
$ |9 Q: G. c9 }. ?% q* m) v6 f) O add_action('init', 'create_custom_post_type');; f. P0 f/ t; T
function create_custom_post_type() {, p. [( r8 s1 R
$labels = array(, y: T- p, @& L1 R& ^6 S$ M
'name' => 'Site Wide Notices',
& n' A( P+ S" }" Z `* ~$ R 'singular_name' => 'Site Wide Notice',* M8 z2 F; p Y+ t8 |/ F* ]
'add_new' => 'Add New',, ^7 B9 G, R0 S+ ?
'add_new_item' => 'Add New Site Wide Notice'," M+ G5 |9 A4 x6 r& A7 A# k
'edit_item' => 'Edit Site Wide Notice',) T0 f9 a. y- x2 ^9 J
'new_item' => 'New Site Wide Notice',) W$ x: X3 W5 K3 D# M
'view_item' => 'View Site Wide Notice',3 K6 X& j" t. {9 T
'search_items' => 'Search Site Wide Notices',
8 {1 Q: P+ P1 m0 T 'not_found' => 'No site-wide notices found',* ~: }3 p! O5 F& E
'not_found_in_trash' => 'No site-wide notices found in trash'" v1 d3 `/ k$ |( R# Z5 q
);4 l+ s3 J( ], h) _, j, k
' c1 I4 I; A: `) u% o $args = array(2 c# R. ]# o) g
'labels' => $labels,
+ m0 t: I+ [: Q; m" q 'public' => true,& G! g. z* M* o) Y
'has_archive' => true,
2 c6 ^6 j& p) e! @ 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
& c$ K7 Z+ c% J9 ~$ x( w9 U: L, w 'taxonomies' => array('category', 'post_tag'),, e5 K5 A# p- b
'menu_icon' => 'dashicons-megaphone',
8 k: {3 `* d$ p* I8 |) Z 'menu_position' => 5,' y! {+ q% G8 W0 v7 `& H; g& m3 }
'rewrite' => array('slug' => 'site-wide-notices')9 N# g$ I* u/ ?9 v7 ?+ w
);
$ o6 H% {! H6 o0 _ t( m6 T. a- ?! `' P: G6 h7 S
register_post_type('site-wide-notices', $args);; `- N0 E E' [* Q
}6 Y; ?8 e$ _- Z/ `' \* i
```
; w2 h' [: @% r* d' `1 @5 r+ C1 m' j% `7 D
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
4 c$ J7 V |# t$ w) ~, t- R e3 d) M: `/ I, H
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
: f# d" k* S- J& U( j0 `8 C
' \5 Y c' C7 {, E$ T ``` W' l- P" j0 U/ C, O
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
( F: t# l4 g9 J5 H, T6 @% K function add_site_wide_notices_boxes() {+ g/ l4 ~$ q8 g8 D6 C3 H
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');" ?3 _& M5 z9 M+ }2 P) }; F: h
}( F" [8 X8 R) G8 p- A
1 i& ?- _9 \' G; m! I
function notice_details_meta_box($post) {
3 ^8 `2 r- ~! [- }) n wp_nonce_field(basename(__FILE__), 'notices_nonce');
. C7 P$ h# X' e $notice_title = get_post_meta($post->ID, 'notice_title', true);2 W2 o! C0 y& T
$notice_content = get_post_meta($post->ID, 'notice_content', true);6 z/ K! E* f3 b& X4 p, F
?>5 _" d/ z3 `0 d+ O1 f. N
<p>
$ r9 @. }$ Y0 G" X" i6 x <label for="notice-title">Notice Title</label><br>/ F' M9 H0 t; P& o6 J- K# f7 N0 G
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
% X4 B' J# I- a o. R </p>! l$ T5 E& J" d) H7 _
<p>
& x# V, A! v8 t$ ]( [. }8 z+ \ <label for="notice-content">Notice Content</label><br>
5 F5 J. i; T2 c3 l <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
2 D r1 ]" }5 |5 e0 A! R9 } </p>3 I J4 J; W0 ]
<?php7 k d! u; [; s" C
}1 D# Y+ `. O5 B' E5 V
+ x+ W! j: d, s" `
add_action('save_post', 'save_site_wide_notice_meta_box');
( k: u6 x7 P) T' [. q' g* g& \$ Y+ X% s function save_site_wide_notice_meta_box($post_id) {9 q7 V$ _ Q0 |/ R* a
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))! C" c1 A6 Q% @7 K3 F3 Z
return;2 c, h' c) v' _) z
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
. k* o3 w8 s) P0 g return;
/ r* o! e3 [, Z$ F1 @8 w: Q: n4 ~$ X- L: |, ]
if (isset($_POST['notice_title'])) {5 t/ c6 r) @) ~' c# X* [
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));3 N$ c, i6 C% \$ D3 r9 q& ^. }
}5 W! B0 q+ R- @/ N; i- T8 J5 G
if (isset($_POST['notice_content'])) {
+ n- K- I2 y4 H! R/ V8 U: f* b update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));* O, `* f3 C* ]
}2 v1 U& t0 X9 d
}
9 n7 J6 n4 D5 `. N ```' V0 L4 q0 z( Q( e
6 `3 [& d: O* ~& T" i, r
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。 c' G9 E! e' K, R# i1 f
0 ]* S8 y9 b: W4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
6 D0 j1 v9 ]+ `. B0 t6 @# B
+ z( [6 \ k2 U% F. M ```
1 G/ \$ |* V7 D $args = array(
% u4 ]) w0 b5 A, {( g, u7 e3 {% t 'post_type' => 'site-wide-notices'," M/ o; O3 Q1 G, ?0 ^9 \
'posts_per_page' => 3,
& i" ~( x: j/ W2 ?/ ]8 D. Y( Y 'order' => 'DESC',
4 h8 u8 L) O4 K$ _; k% y/ \ P* o 'orderby' => 'date'- d8 l& T/ f1 G3 f( z$ x% i) }/ C
);
( w4 |9 F* F' ^) q+ Y; P $query = new WP_Query($args);! Y* _7 K; ]* l( X
if ($query->have_posts()) :- o& n9 ^# m9 l% `3 n
while ($query->have_posts()) : $query->the_post(); ?>
6 G6 \( p6 _2 L) ^" k, X <div class="notice">2 R5 t6 Q! J, S6 Q7 {1 i" g7 L
<h3><?php the_title(); ?></h3>
0 k4 j) ^# O# \; U# W <div class="notice-content"><?php the_content(); ?></div>
v$ S# R; O" x# K) R; H. |, d </div>% L" y/ i }* {* F) e- Q2 E
<?php endwhile;
$ N6 k& h$ m; l# d wp_reset_postdata();7 K3 _/ s/ g( U
endif;
0 g, h3 {4 f3 w" V! c ```& a3 P5 ]9 b5 r9 h! s4 k$ {
+ b4 ? @+ ]$ z+ o' @2 ] 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|