|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
" I5 y9 B) s3 V" Q" y/ C) _+ W; U. t* w+ r- j, R
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。0 t; o! h1 z, ~+ K) b! V3 v) Q4 s
& g6 G4 }4 o5 C* C) }( h7 K以下是创建自定义插件的步骤:
3 _. B, M0 G+ v3 k, }$ _, \1 [
. W" b, o/ f5 S2 U/ C1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
Z+ R: {0 E1 ~' H; v$ _& A5 m# P2 F* R+ i) d/ _' D; g
```9 h/ p0 l0 R* j+ }6 @. H' i& J
<?php
1 P u+ S$ i! L% u7 ?8 F5 O /*
: z/ Q8 h. Q+ \+ V Plugin Name: Site Wide Notices Plugin
: ~4 H7 H+ c2 y' i Description: Adds a new custom post type for site-wide notices.
! H+ {& Q* v+ @+ {/ _ Version: 1.0. ~1 I4 t7 \; N
Author: Your Name! H' Y6 X( D6 P1 f# m
Author URI: http://example.com% {8 p4 O [0 X
*/
) {: @5 u4 E M; ^0 V# f3 t* x2 u I) a. S, G
// Add plugin code here..." n( N9 v) M/ b: z" c
```
" U' F; I5 x' U8 Z! d. P0 ^+ q5 `( T" w! P+ s; I
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。) k1 n9 @! B4 q7 X2 }
- T7 r8 B6 P/ G4 \# M; y+ K* V: J2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
( M D5 P. w S; W3 @4 K: U9 X2 e+ d; \$ J3 g
```
, F4 e( _' h' i3 `1 T* H5 w add_action('init', 'create_custom_post_type');
8 N- X' k1 r9 \* K function create_custom_post_type() {2 ]$ Q# e4 T7 _3 z3 T$ S, n# a/ N5 h n
$labels = array(
; q4 S$ ^8 j) d+ Q 'name' => 'Site Wide Notices',
5 _, c7 Y6 r' ]6 I0 t" k3 B9 l# G 'singular_name' => 'Site Wide Notice',
: A) |# H) O. J3 X2 R- B0 D 'add_new' => 'Add New',
5 |$ ?$ Q d5 z9 c. O( [' i 'add_new_item' => 'Add New Site Wide Notice',0 U8 U2 e8 R# {
'edit_item' => 'Edit Site Wide Notice',
) Z# F3 }4 o6 O; F 'new_item' => 'New Site Wide Notice',) r. Z3 v+ L6 E' X% d
'view_item' => 'View Site Wide Notice',7 c7 j' Y4 i0 }& m4 g( m/ ^
'search_items' => 'Search Site Wide Notices',
1 H# F) H/ w7 U6 X) } 'not_found' => 'No site-wide notices found',, _) h. R( {% @# E
'not_found_in_trash' => 'No site-wide notices found in trash'# p" Z1 J, {! q1 L9 j) _+ h1 b1 ^
);
/ \2 H6 J; @) G
6 G1 R" L A9 W: a; a; ] $args = array(
" s! T$ I6 V- s7 \ 'labels' => $labels,* @) g2 K9 h$ f. T6 T# d
'public' => true,8 j7 ^) t6 N$ d) C/ N. _. N
'has_archive' => true,/ }5 ?8 G7 D5 o/ k' [& z% a: Z' O7 R
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
. M9 w1 J* @1 o2 q" g 'taxonomies' => array('category', 'post_tag'),; ?, Y G# O( b& O& p+ c
'menu_icon' => 'dashicons-megaphone',& G1 s! W6 ?' k+ k- g0 D! J3 ^
'menu_position' => 5,0 e# A1 q3 I7 A8 f
'rewrite' => array('slug' => 'site-wide-notices')
1 v/ A2 F {9 j3 w% F# X" x6 ] [ );# ?! N9 p3 v4 p W1 f( E
4 }+ m6 L/ L: P; U2 `" P! B
register_post_type('site-wide-notices', $args);
1 G: E; }! I0 ~7 Y }
" x6 D: y) [' O0 o H5 U% H0 \ ```) M( M# u: B" E1 }% \4 e
2 \' F( R: ?9 c, X( |! j1 Q6 i0 D3 G' s
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。) r- Z% r3 A6 T: r" G7 _ A @0 L$ _
- h3 C( A# ^' h& V- `! M4 x
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
( Q2 S% P9 J3 S: Z& {
' X' _. a) B q3 a ```
& D- u7 h# `" L4 d1 @8 x add_action('add_meta_boxes', 'add_site_wide_notices_boxes');4 |$ x7 @1 U/ q" k
function add_site_wide_notices_boxes() {' f+ l: r! X+ R U6 t/ r5 b$ v
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
3 Q {! a1 j: g( t( p }
" l* a: D7 _6 U3 i. ^
$ e) f& y `0 e9 s8 r& S function notice_details_meta_box($post) {
# _9 M/ I5 s8 d( U$ _7 m: f wp_nonce_field(basename(__FILE__), 'notices_nonce');! i8 A* \6 b& n. u4 d$ W
$notice_title = get_post_meta($post->ID, 'notice_title', true);6 n* M' g8 R1 Q. d) f
$notice_content = get_post_meta($post->ID, 'notice_content', true);
. p: d* q% H& I1 ]% z0 f: j w ?>6 M* k' Y& U1 v2 R5 S3 d5 i0 n k
<p>
5 e5 _3 s$ Q. V <label for="notice-title">Notice Title</label><br>. r; Q) @' H0 M
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">+ M7 X( h0 c4 ~( x' x
</p>
" Z, O- m0 u- x: _: ~5 K" ~$ @ <p>
2 W8 Q' M' A8 p+ u- y% n <label for="notice-content">Notice Content</label><br>) P% I3 o! P/ E) g
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>- w3 n% C! H$ U% ?# A
</p>
j3 u! s: {! \7 d# n4 I) f7 X' M <?php
' @. D1 `! Z& T# ]8 R C# ^ }
1 l1 ~% w' c/ D4 K6 u6 K" S5 P4 p7 e' a! `0 |
add_action('save_post', 'save_site_wide_notice_meta_box');
' [' Y6 E U! w' C( N function save_site_wide_notice_meta_box($post_id) {- m0 p. ~, ~& b" C. c: B* v
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
# r3 t4 J( G8 O5 m8 A/ z0 [. p return;) U& L1 T0 u$ G% e6 O, x
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
( h/ G! [! |+ r return;$ T* P# w/ R& [' R" ?
$ l/ c: j f F0 ~ T: D2 d if (isset($_POST['notice_title'])) {. r! v. }0 f( \8 ^
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
8 f) t' K+ V# ?# q }
K5 m" s6 B6 F3 l0 D2 t- M \ if (isset($_POST['notice_content'])) {; B C: L1 Z, B) C) C3 ]+ j
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));9 c, L1 K0 A0 T# O2 x! e
}
r! ~" j( ?& _. u1 Y: U }8 @* d+ [, Z# k! ]- _! B) d
```8 M$ B S+ S7 j) k, ]& S% i% b
7 t) Z+ \5 v! H
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
0 }* m" L% u- K# z
( V1 v( c! _( F' b z: [" U4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
+ Q6 P4 m; u, i4 G9 x* M* n; ^$ I2 {, G# y" R3 O
```
6 d5 U; F. Z; Q w $args = array($ w& u. g5 N' V$ R
'post_type' => 'site-wide-notices',! Q1 K. \. _% C6 Y$ @
'posts_per_page' => 3,; n7 k! ^' Z% ?7 A) E- N
'order' => 'DESC',- f7 H% o. X6 {
'orderby' => 'date'. n6 u4 a" W" V7 P
);
& T/ Z( O6 L+ b8 U( h Q $query = new WP_Query($args);/ m0 U o; w0 p1 _4 L7 d
if ($query->have_posts()) :6 t# G2 h' J& T; M7 ~' p8 g
while ($query->have_posts()) : $query->the_post(); ?>+ W/ e* u1 ?& J. f5 n- D* P+ |
<div class="notice">
' K; s: R' A, S0 l) U- M, s <h3><?php the_title(); ?></h3>! L: J) {' d# m# \6 y h
<div class="notice-content"><?php the_content(); ?></div>) `. ^ q4 N/ U# Z; Q' Z
</div>, v( \5 o- L/ I
<?php endwhile;
" s% B/ @& V, Q/ d wp_reset_postdata();% P# }1 K1 M5 o( h
endif;* C6 G: Q% I1 u, }) l
```% V8 t& S( S9 \5 ^
& a8 |$ a/ ^4 W8 x( t: ~, ^) V0 c 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|