|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?- ~! G2 ?& s3 R5 s W
3 M- {% }1 h( T: I0 w' T+ ?如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。# e5 d" \- Q# }" m
0 ^8 ]% s+ V1 i" c. U3 @- l以下是创建自定义插件的步骤:
+ ?+ ]4 b( ?4 \1 P0 f+ n7 R1 \' [% L3 r& e6 S' I' ]
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:. Y; G, h: y; E# ?% i# D
x6 Q7 A k4 E2 B ```
9 [! m$ k/ U$ K( W) d <?php: X3 \) e3 k& U5 K* _& x
/*5 ~# {! s6 W, A9 h6 r
Plugin Name: Site Wide Notices Plugin* @( @9 C R* I+ x) d9 E- u
Description: Adds a new custom post type for site-wide notices.
) v3 k7 t5 a7 c# F; f Version: 1.0
# q+ }3 X6 V1 I: q, e$ i0 W Author: Your Name
O6 a5 R4 f, _ T7 b6 R/ B- N v Author URI: http://example.com, L1 F8 y- j! A, x% B2 z
*/' G/ U: P! ?7 p; h1 c' H# Z
4 \( M! G; n9 o0 Z- k2 |/ F: I, z- m
// Add plugin code here...
# M, @# Z \ w ``` i8 C/ d' s" U+ q& Q; a, T
3 t( D9 ]. i& g& l1 z* ~
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
: z( d2 b1 ]3 Y ?
/ ]* w, @0 V: ^! O( n2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
) g. F0 \" ]# A/ B
9 W% _5 d3 q' e' e% j ```- J5 }& G% n! k; x; d5 v
add_action('init', 'create_custom_post_type');
( t. h8 v+ t: j7 S9 ^ function create_custom_post_type() {
% l' k% Y7 P' H$ v/ H $labels = array(' n4 [ Z' ?1 i/ e
'name' => 'Site Wide Notices',1 h. N' j* J' j1 B5 S! j9 n
'singular_name' => 'Site Wide Notice',
) Z% u+ l$ f% L7 \6 H 'add_new' => 'Add New', E# Z6 H- X% J A' j
'add_new_item' => 'Add New Site Wide Notice',
- [6 L; R. k) S# n# A( q4 Z& m5 t0 w 'edit_item' => 'Edit Site Wide Notice',0 I; j: X/ ^- Z) x1 W+ y
'new_item' => 'New Site Wide Notice',
' t: Q7 v! P6 |1 S2 ^1 L& I+ x 'view_item' => 'View Site Wide Notice',8 S; H$ X/ y9 J/ w. L# x/ ?6 ~
'search_items' => 'Search Site Wide Notices',
) M7 z' I" \5 l2 k1 e7 Y, s" s6 o 'not_found' => 'No site-wide notices found',& x% b* o; [" m- M
'not_found_in_trash' => 'No site-wide notices found in trash'
3 N4 p" v8 Q7 D8 R, S5 x4 w/ g );1 L, i& s# ^! P: D
8 Q0 M8 D% Y9 T# B4 b $args = array(
; V N/ X1 o" v. l9 C3 C: o( g 'labels' => $labels,7 a/ f; D6 \; K( ~5 a4 s
'public' => true,/ S+ Z1 N( [, i: k% o
'has_archive' => true, Y# g' L9 z: ]( N* s- n8 D
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),) o( _! y! q9 H7 z, Y% M5 I6 i
'taxonomies' => array('category', 'post_tag'),
/ @. G: ^' C% g1 u3 H/ d" }" ?: ` 'menu_icon' => 'dashicons-megaphone',
5 V$ m" f4 J0 w1 @0 m 'menu_position' => 5,* v& ]- |6 _' K4 T9 c7 a. j' c7 n% ?
'rewrite' => array('slug' => 'site-wide-notices')/ p9 U4 d: Y/ c3 p* d
);
. a) R0 S b8 g. K. w
( Z( j3 G6 D5 _9 v! m0 a( l register_post_type('site-wide-notices', $args);
0 E/ ^4 S% R* Z) B; M }
- R/ W7 R. ?& n9 k5 Q, J ```
1 p, I- c8 r2 k9 e
; q3 u( Y$ A9 K; i 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。3 h0 g" o! _7 B& ]
& Y3 O8 X# A9 r1 \+ E
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
1 N+ q- K) D9 S7 ^* N
- d% U- k( `5 E6 W ```
) }7 i% \ f* b; w4 |# S% \ add_action('add_meta_boxes', 'add_site_wide_notices_boxes');& Z8 o6 ^* P9 z- J
function add_site_wide_notices_boxes() {( ]' d0 D# s, F4 C* T
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
# `- I/ @! {/ | }
$ o( a6 A( H9 K- O: l2 T
: m6 U5 i' [# `+ H- {( w) A. M function notice_details_meta_box($post) {- O7 h9 I% A8 g0 V2 q, X
wp_nonce_field(basename(__FILE__), 'notices_nonce');7 M! Y! z% ?1 Z+ ~/ i' Y
$notice_title = get_post_meta($post->ID, 'notice_title', true);% I3 B, c3 ^3 H# l3 a
$notice_content = get_post_meta($post->ID, 'notice_content', true); J* ]2 Q; m8 B; Y- r4 q
?>; f. f; \5 J# M3 ]/ d) o
<p>
6 l: i M Q. C* F* t- W2 [; @6 K <label for="notice-title">Notice Title</label><br>
( v& K T3 X+ K# c- A <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">/ {4 }. R, p, A0 Z# [# l
</p>
8 s2 s# b# j6 u+ p7 U9 v. T1 M <p>
Z! K) E* _2 ?* |5 X <label for="notice-content">Notice Content</label><br>
) {6 K2 \) a3 o6 W <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
9 |; I$ L! v4 E$ F8 v </p>9 h2 N* O1 z0 \0 {* e) u$ g) v& P
<?php; g( y, {! m& r0 _; e% i1 u* H5 G1 E
}
8 [# k' f9 w8 C4 ?, ~ p; E1 z8 Y9 B1 X/ ?5 j
add_action('save_post', 'save_site_wide_notice_meta_box');
Z6 W$ b# w1 _& N6 ]6 B2 k W0 P9 e function save_site_wide_notice_meta_box($post_id) {
, Z s$ }( W1 W/ H: |/ A) A1 k if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
; A3 w% U3 w/ c6 u. z5 I( M+ R# d return;3 O: ?( s/ M: V7 w
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
. V. f4 A# s" ]# I5 z3 r; ~ return;
- h" m' U" E2 {& k2 |8 q- a. ]$ r3 F, D" B/ a& C
if (isset($_POST['notice_title'])) {
6 M# D. @/ ~6 u& Z update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));1 [' g" H2 j, t8 W8 {
}
& u8 n5 s2 m9 }2 L1 M5 T if (isset($_POST['notice_content'])) {
* n7 G- m# ^7 g update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));5 N9 [6 Z) k: v$ B' \/ `$ g
}. M0 [: F; y2 d# k5 G# t1 g
} d& z8 @! h6 I7 L; p# W
``` [9 P$ w) o9 Z( d; i, N( U
; j+ q, O, L6 D! ?0 E
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
- R8 m7 R: }& F% }7 i5 \. f5 ^5 f
0 v; |. x) p. B" T5 V4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
; C( R. c, |4 f& u* x+ L0 e0 ~4 D. ]% [% [( _' L5 o) d
```) D$ {4 l# ~9 I
$args = array(2 |; h5 L$ R- B3 P! z
'post_type' => 'site-wide-notices',
, B# G$ f) l( m- ] 'posts_per_page' => 3,- h6 b1 l- D' n4 r# D
'order' => 'DESC',3 S1 k" F2 `+ X' z# o$ _
'orderby' => 'date'
9 t0 g- x, K: l );0 x" H& E+ x- W' _
$query = new WP_Query($args);6 \5 L& ?, d4 s$ {
if ($query->have_posts()) :6 F/ P2 b- [3 ^4 a& S+ R! _- {
while ($query->have_posts()) : $query->the_post(); ?>
' P t% i- B; t/ B/ d <div class="notice">& c) P; K8 t: B/ |/ s5 D- j1 J% @
<h3><?php the_title(); ?></h3>
, d& e; C% t% N% V <div class="notice-content"><?php the_content(); ?></div>
0 }- I/ c8 ]. A3 g </div>- z4 z6 G0 R# a: r7 {
<?php endwhile;
: ^ p% @* j e. g1 U wp_reset_postdata();* c$ o6 q& a2 y0 c2 M3 G0 ]- m
endif;3 @( s. t# T Y- I0 {5 S
```" T; ~6 C% P, ^# Z b- d. m R
/ \, k1 X, P* h! u# O, ` r. J* h
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|