|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
3 A( h$ n3 f6 ~$ \2 w) f& g- D$ m, Z/ o/ V% s9 ^$ B! }& P
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
. V. y* m" d2 b+ p8 F6 {
! O9 l3 f/ ?- B- ] m" o& m以下是创建自定义插件的步骤:
$ ?7 a" u4 Y2 g# Q( u/ W) }) y3 J8 ^5 o$ w
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:' w! ` \! P' _& i# {
* x# g& v8 L7 @/ z- S# f
```
# H( B4 v3 ], U) Q+ v5 }0 X1 U4 g <?php2 v& `7 L' c. Z) J0 ?: {* H+ V
/*
" r: Z: Y7 @! { j$ ?1 S; N Plugin Name: Site Wide Notices Plugin+ R( e% |* D9 F1 m
Description: Adds a new custom post type for site-wide notices.$ s2 p5 {% ~3 U3 e$ ]: Y# C
Version: 1.00 @0 l$ p9 V5 s, E. W
Author: Your Name+ y+ C) k7 x- }# Q
Author URI: http://example.com% d; P/ j w0 z& W
*/
4 I( G- f3 \3 r. c2 o+ R
# A- G- X5 f6 y* a& i // Add plugin code here.... B6 ~8 V- A8 i. n h" T$ F
```3 L; j3 V6 l# s7 H0 ^" i
8 b( B" H& r7 |
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
5 D. F+ e. \$ E4 ]
% \ \# o2 j+ v n& W; ]2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
6 x$ | p7 v6 i/ r0 R! O' k3 D. h" L, g F7 q6 V* p. O' G
```/ b; ^8 o1 k: p3 r; R) L- j4 h
add_action('init', 'create_custom_post_type');7 f8 M$ S1 A+ I# v$ M- l* C B* I" z
function create_custom_post_type() {
5 ~) Y. D C F' K4 \3 M $labels = array(+ k5 G0 Z, s; b! z! Z; X: E! V8 u6 N
'name' => 'Site Wide Notices',6 \) b9 g, `9 x
'singular_name' => 'Site Wide Notice',/ Q" M7 f( U Q: B9 K
'add_new' => 'Add New',
* F @- m* s1 e) q! g 'add_new_item' => 'Add New Site Wide Notice',
- J' u2 h0 u# P3 G, K6 N5 Q. `2 p 'edit_item' => 'Edit Site Wide Notice',
8 O5 Y, O( a: ?3 [- u+ L& p) g 'new_item' => 'New Site Wide Notice',- g" D: {, v, K/ {+ G* L3 x
'view_item' => 'View Site Wide Notice',' E# v9 X8 Z6 I& Y! V3 e
'search_items' => 'Search Site Wide Notices',
N$ c& M; v3 k/ K- h 'not_found' => 'No site-wide notices found',: p$ C: b6 q& {; e- J& }$ ^% U+ K
'not_found_in_trash' => 'No site-wide notices found in trash'
% T* d/ [6 X1 q );
. M% Z4 l1 `6 I% U) N9 t2 [; A" r* o
$args = array(
$ w* X' F7 i7 X& N1 J 'labels' => $labels,
4 Y) `* }# u- H. M$ R1 g! U1 [% ~ 'public' => true,( U% N8 q! @: E( ?. U
'has_archive' => true,
1 ^/ o v2 v1 Y, `! I" y 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
3 }+ r. y8 \# T1 [5 R. ~4 Z' K* v 'taxonomies' => array('category', 'post_tag'),) E" f1 n( b, I. f; G. `5 B
'menu_icon' => 'dashicons-megaphone',. N5 c# T1 d3 E: l" _$ G7 e/ O
'menu_position' => 5, n8 a6 U) k0 ]7 B/ \3 a- F2 l" t3 U
'rewrite' => array('slug' => 'site-wide-notices')
" z2 S' A% T: W1 {1 D. u5 \ );
7 V, ?' Y1 @7 z) v1 k
9 s" h7 ^+ e, x7 g( H V register_post_type('site-wide-notices', $args);
: S* V% }% @) w7 I, f2 K# _ }- c8 _- F6 A" @' m5 H# H
```
7 l2 t3 v2 p0 k8 a7 O7 }' H3 j. G. m/ E& B# _
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
3 w& E) W' q7 Z
5 U8 X4 c; c J/ H* M! w3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
5 U3 Z" k/ R2 h# h6 v) U) s7 w. R+ F7 e8 d/ S
```
7 J, |$ o; N* ^: b" p1 s, R add_action('add_meta_boxes', 'add_site_wide_notices_boxes');) P, k" D$ W2 ^2 j
function add_site_wide_notices_boxes() {8 e2 Q/ L1 v( L% _
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');% T: j" V. M& W; i3 t2 Y
}
# j5 a( K( c/ c* ~0 |, c' a5 n4 X8 i4 V. u- X
function notice_details_meta_box($post) {
/ |" P3 ~, p6 T ^* z& P wp_nonce_field(basename(__FILE__), 'notices_nonce');8 ?* y o* K! `2 A) v
$notice_title = get_post_meta($post->ID, 'notice_title', true);, _& Z( o6 n) c% @) w$ I0 y# P
$notice_content = get_post_meta($post->ID, 'notice_content', true);1 b$ h/ X3 R' @. V, y
?>: n+ Q, R8 [: }& ~9 i. t2 M7 q7 T
<p>
; g) Z3 T" }, Y* K <label for="notice-title">Notice Title</label><br>2 R. d# l/ k, Q+ K: t* W
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">0 {3 w+ B& S w# N
</p>7 e, `# b; {1 @% @8 _
<p>
& ]6 c" |, X$ N7 e. p+ h4 I <label for="notice-content">Notice Content</label><br>3 Y6 Z& s% F- H; P5 T; D N
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>4 ?) i* h2 ?3 z* h: m: H
</p>
+ x& O6 h$ Y3 {* Z <?php
( Q- W" D0 [- W }, ]: J. w0 a+ S* h1 y9 }
6 o# y7 i: q- m* ?# ^
add_action('save_post', 'save_site_wide_notice_meta_box');* t4 b z3 d. S3 F7 x
function save_site_wide_notice_meta_box($post_id) {
9 l, W/ N: \! \2 M* v# q if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
5 X I0 l+ j: Y: M0 g& U$ G return;- }7 S1 X5 o! u2 G1 O* y; F
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)5 }6 f4 w( c1 b. Y
return;; d7 K! F& O$ ~- W: ~2 D; _( O: e
0 B P/ R9 O! ?: S/ u7 p if (isset($_POST['notice_title'])) {2 ]# K2 G' v1 v( i
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
% K8 C0 g8 ?, o6 O9 ~ }
- E" H4 M" P; m# K6 y/ j" y* `, s if (isset($_POST['notice_content'])) {
5 H- c7 |+ ?# x5 w update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
7 C5 ^: y! ~2 ^0 } }6 O! B% M6 G1 y
}# B( G" |1 K- t
```
4 d8 v7 D6 f W8 T' K1 f3 s* ~
K7 m; W! D, v# Q4 _1 [$ R# V! J6 ] 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。! J4 i3 V6 B. [0 e, P' c2 j* t
- s1 k9 G! F) v5 g; M. ]
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
! C$ v$ F$ @8 ^, H S/ R8 Y% N: y2 o+ w1 @1 _$ I" s
```
( `( F2 @" K5 ?' G* G% O* T( z. k $args = array(
2 ]9 { z! M% c! {+ n& S- r 'post_type' => 'site-wide-notices',
. d9 u- M; r9 z5 A 'posts_per_page' => 3,4 B- b% c) i! S* X3 s) M
'order' => 'DESC',3 r2 q6 o! p$ s# X" k+ \) E; i7 f
'orderby' => 'date' `+ F, }) ~1 Y3 ?1 U, l
);
# f0 @. ] k( u/ }% w# y2 S1 } $query = new WP_Query($args);
# j0 f; K' P2 M% y) Q/ f3 }2 { if ($query->have_posts()) :, W8 e9 R/ Q/ ?+ G8 W
while ($query->have_posts()) : $query->the_post(); ?>! P: a \' ]! D8 j; x$ _+ _
<div class="notice">
' B. N$ F5 z& P6 i. N: R/ r; T9 g <h3><?php the_title(); ?></h3>* U- `* \- k0 g2 y4 N$ K
<div class="notice-content"><?php the_content(); ?></div>
) y3 o) z0 F6 l/ u! @ </div>
" W, z( E# ?+ J0 c <?php endwhile;
, J. P% f7 u3 Q$ n, B wp_reset_postdata();! c6 e7 M. f3 ]: O7 Z! W e' n% m) G
endif;8 [8 R8 Q5 W3 d( T+ ]$ ?
```7 [- \2 h: ?+ X- a( s0 ^/ S
3 F8 K" {( O, n! w1 i& W- Z
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|