|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?- }; d9 B7 E, E6 t# W" V
+ D9 i9 f( O) U9 q4 Y
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
& ?7 }# w" P7 Q& \3 y; A, p$ }+ N5 o4 S( n
以下是创建自定义插件的步骤:" `7 \6 A+ K5 r0 P7 k; t" }7 j
& {& p: f0 E) B- {5 h8 u
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
! [; K$ C' H; u# j
* C8 o' j$ I3 @8 p6 p ```
; Q0 V U9 A6 p R7 _ <?php7 g' K# R) P8 i% C% }0 r! T2 A
/* Q( U5 y- d3 e6 C- |$ Z
Plugin Name: Site Wide Notices Plugin' u- W8 T$ K7 I+ P7 f
Description: Adds a new custom post type for site-wide notices.% o# Q# [9 a! N$ ^* ]' V6 x
Version: 1.0& W( o1 Q4 V- I1 h
Author: Your Name5 \2 G4 [. S! u
Author URI: http://example.com
) K* V2 w1 Q. z */- e) v! W8 o9 N/ \3 q. W
, Y/ I. M: N J( T
// Add plugin code here...
# y# C/ J/ i! I$ Y% l, C ```
; W! T, O' Z6 T% p, i4 t* D( Z7 N4 c! H5 f
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
, d8 Y0 e" r4 [, y7 ^- m. X
" s) I! D R! |$ S, S2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:/ N! J X7 |9 W5 D- z1 W
W6 U7 S' M! ~: y* k& `, p
```
& l+ n! L- S9 J1 s5 {1 Z5 ? add_action('init', 'create_custom_post_type');" e2 u- W: }' S4 k9 p9 A
function create_custom_post_type() {
0 r6 D, B3 B( J& o+ ` $labels = array(3 ]. u) ~; g+ J, n2 T+ d
'name' => 'Site Wide Notices',( O$ `) T" R' k# L. T
'singular_name' => 'Site Wide Notice',- k9 _2 e/ ~ E# K9 [
'add_new' => 'Add New',
8 {! y% |2 G W6 M b* S6 F/ y 'add_new_item' => 'Add New Site Wide Notice',; N5 I6 V) i( b6 P* N
'edit_item' => 'Edit Site Wide Notice',
- a5 m- d% |4 _9 | 'new_item' => 'New Site Wide Notice',( X D9 Y6 _1 D$ D! L' v
'view_item' => 'View Site Wide Notice',) ^9 L9 G" h6 K! J' g
'search_items' => 'Search Site Wide Notices',
6 J( e6 J* b8 x6 r1 v4 x. W9 W' W. E 'not_found' => 'No site-wide notices found',. N- X& O! O( @& V2 }+ x4 _
'not_found_in_trash' => 'No site-wide notices found in trash'* x" e, ^7 s3 q8 {; ?
);7 Q% U0 A8 ?# H+ @ e8 L
! t( |4 y0 e+ W8 @
$args = array(
2 b6 \* B4 G/ H8 ^ 'labels' => $labels,$ {( b7 Y2 r7 T- R' M, d& \* u& E
'public' => true,
: C! Z s9 y# p& h 'has_archive' => true,& J t9 N, B' B8 P
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),. W7 `) X0 S; h2 `
'taxonomies' => array('category', 'post_tag'),
K# L' S- A% ^ ~9 E' f# b. w$ e 'menu_icon' => 'dashicons-megaphone',9 c% p8 t7 w$ e* ]% o K
'menu_position' => 5,' Y; b& y9 Q4 V0 U9 F$ t7 M
'rewrite' => array('slug' => 'site-wide-notices')$ y) r/ D- u9 s: F9 d7 ]
);0 x3 w' e4 E" ^
. j/ d7 [$ Y& |
register_post_type('site-wide-notices', $args);
8 Q- ~% r# [! z T" p }
: D( g* {1 Z4 E' \9 y ```
% s( @; p% L, S7 q, m1 u2 Q, c2 v: i. [: @* S2 I0 t. M* Z
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
' b3 @8 o7 }+ }
+ P" P- G& P0 L' F: x3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:, E+ s, I# }, d- ?4 v7 K1 F' j
q6 B' u6 Y& X: ^& j5 }* V# m+ p1 ` ```
% |! u0 b k, p+ i0 @ add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
0 Z0 d8 C$ R2 Y4 K function add_site_wide_notices_boxes() {
6 l! g& h5 Q) s% r& \7 y) |. c! F& G add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');5 I' _& E1 W) W7 w- W
}. w- n3 N# H- j4 }3 k5 M5 I
9 M% U5 n; X, s+ }! J
function notice_details_meta_box($post) {) h, M7 H _$ P' k8 L i
wp_nonce_field(basename(__FILE__), 'notices_nonce');
4 R9 K7 \/ m( B$ W $notice_title = get_post_meta($post->ID, 'notice_title', true);
' n0 D3 x8 d4 x* F/ R $notice_content = get_post_meta($post->ID, 'notice_content', true);
4 I/ A- Z+ h" Q+ P. Q& N5 e& L& I* k ?>
' O7 `4 m6 k% j <p>* W: z" e( s* _/ r" x! X) K
<label for="notice-title">Notice Title</label><br> u/ t* w, s' _% h p" w. f! I
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
1 e7 z* q( ~! A9 S5 R7 V </p>
5 M0 m* B7 `' Z1 o6 Q <p>" e& B( B% [+ \- i) U# J( {. c9 \
<label for="notice-content">Notice Content</label><br>: ?* ?. q0 u- W) X$ L) g& L* F0 w. K
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>- k0 a- r- U5 `- A
</p>
7 `4 e! w' `* o5 k" u <?php
+ n8 @! I$ ^6 C* S6 q }3 l+ V# q& @# j
7 W* ~& f2 N0 w# A% H# H add_action('save_post', 'save_site_wide_notice_meta_box');8 W9 p& u0 Q. X- J/ z* q7 W
function save_site_wide_notice_meta_box($post_id) {. f! ?+ v- h: p. \8 ?; V$ a
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
3 \) V! Z$ H! E \0 v return;# p" i2 ?0 \$ ]3 B4 q" |8 W6 }
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE); s& A- \" k0 J* B
return;
. j* ^' A1 h0 V/ }. e. V' i3 f" e# k% G" o* J& e$ n* e
if (isset($_POST['notice_title'])) {7 z$ {0 Y( K: x- E1 J) n( a1 n
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
/ p/ ~" h* r& A }
: N: S3 x4 ]0 Z. A: p if (isset($_POST['notice_content'])) {
/ f7 ~) D0 H' g0 R% w6 [( N' W update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));/ e) g0 K3 v( b0 K$ f0 _, D+ u2 x! _
}
' a; H" o/ M" B! x' B3 s( \# U! s }. I; u1 r$ x6 E7 B
```
+ C* n" B2 L" u! G2 u# @( ^- ~2 u% V* c4 j; X! e
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。6 Z3 _1 |( r6 Y0 V0 @% v
! i c6 Q( R% m9 o* N
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:" f8 [$ f' ?, n6 B2 l# B% p) R1 Z% j
& @, _. y4 m. c# Q$ R: h- U$ E ```3 J6 }& B* }7 g9 l5 Y
$args = array(4 z$ U( k7 `; X5 q4 s& m# \! u
'post_type' => 'site-wide-notices',- L% d/ F r+ v8 S/ c& G# f
'posts_per_page' => 3,+ G& U: \, X) _- i1 g1 o& W- Y
'order' => 'DESC',) G* ]) [. @3 b8 [' B' }* ^' |; v
'orderby' => 'date'3 E! h2 o2 l7 Q1 _6 t) c# e
);3 ~7 h- g; Q; ^ K
$query = new WP_Query($args);, k2 C6 _5 X1 J0 T) {" w) z! O
if ($query->have_posts()) :
* b* ~8 j; q& F8 `2 ` while ($query->have_posts()) : $query->the_post(); ?>
! V7 s! @ a0 [7 x! D7 s. q <div class="notice">
' p e W$ }& [2 U: G9 P <h3><?php the_title(); ?></h3>% S4 f9 S5 {2 h2 B# P5 t b
<div class="notice-content"><?php the_content(); ?></div>( d! Q6 p) m7 O' j# e
</div>) i% @+ O: T+ t& m- f q& i
<?php endwhile;6 g7 ~! ?8 A; _) h9 M
wp_reset_postdata();
- U% a5 Y+ d9 z! S+ t* X1 i2 ^ endif;8 ]9 U. m" f, G5 a! P- M
```, E7 {; `1 S. I w! n3 g; L5 m
/ L- g) \4 j5 f. _5 V
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|