|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
7 U8 f" r% U& O! P( e8 i' s; F& U9 g n; _) z( ~# m+ ?/ N
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。) c$ _5 `7 S, I) g* h( B
' G8 x/ b' H6 V, D( i以下是创建自定义插件的步骤:
$ V% T& [$ O0 c8 V: O# x2 t8 e2 U; t% x
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:# a2 Q# M2 A M8 c
: c/ \- c" R+ s1 {; T6 R# j! Q ```: m8 x: G0 U) K# V4 d1 P
<?php
$ c, s" p: P: b4 J5 x /*
' W4 y' e; P# \8 d0 a0 @ Plugin Name: Site Wide Notices Plugin
1 y- u3 u0 K* A9 G- @ Description: Adds a new custom post type for site-wide notices.8 A' G! r* W7 J( z3 t( |$ D
Version: 1.0
. }4 y) \! d5 ^( d4 o; Q Author: Your Name
9 X9 a8 S" e+ t k+ R Author URI: http://example.com
0 s( w9 d" I& B: l */0 v, t) c, g! [. F2 j
7 w* d$ O5 w8 p7 [8 ^1 |
// Add plugin code here...
5 h2 u8 |# {# ?3 E) o$ x ```
/ K0 \1 w8 c3 G7 u+ J) S4 b I" p
; }9 Y; E9 Y3 i3 o) Z# a 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
3 x6 T. F. n# [; x M
5 y( W- _" u# ]" d; g" }- j! Q2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:6 `8 y8 H" Z: m: t
$ O, G1 b# E1 b ```
0 A! ?! v4 h! r1 ?" W5 i add_action('init', 'create_custom_post_type');
% {- Q! o# b- w6 k) I, F function create_custom_post_type() {( m/ ?; o/ F, o ]! C; E! R. \
$labels = array($ K C6 C2 G- S+ C) b
'name' => 'Site Wide Notices',
2 A$ e. C5 \" C* S 'singular_name' => 'Site Wide Notice',# f( H; _( v& q: {. s2 ~: p" X% L
'add_new' => 'Add New',
: g% q; h) s4 k 'add_new_item' => 'Add New Site Wide Notice',
1 E, r6 _: u" ?0 P# z6 H 'edit_item' => 'Edit Site Wide Notice',
$ g% r: L6 i3 s U# y 'new_item' => 'New Site Wide Notice',$ _5 A0 u* U, G8 G# r3 B
'view_item' => 'View Site Wide Notice',. d& w5 x" n+ S; d! Y1 H; s; n
'search_items' => 'Search Site Wide Notices',- C4 J+ ^9 b- v# E7 [, z# M
'not_found' => 'No site-wide notices found',
( a& M @# @3 a2 ` 'not_found_in_trash' => 'No site-wide notices found in trash'
J- k) ^; i$ p! M; ~% B( D8 Z );' H* h2 j5 ]8 [, l7 Z
9 O2 V" I, G$ V7 p9 i* l4 d; ]
$args = array(
7 b C: F- {% u$ d3 k$ }' E7 K 'labels' => $labels,
9 j }* h6 O) \. U 'public' => true,8 g7 p2 F/ n# Q! J ~
'has_archive' => true," ?/ V: G: E9 W4 w+ k" I
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),3 a3 e0 M4 b6 x' K8 c; Q% [
'taxonomies' => array('category', 'post_tag'),* [3 G* V$ X. Y! Y2 w8 _
'menu_icon' => 'dashicons-megaphone',
: c9 a+ {, D1 D6 v% y1 w6 o 'menu_position' => 5,+ _& G/ r' x1 C2 O3 W& J0 C
'rewrite' => array('slug' => 'site-wide-notices')
; s( l3 t* ]7 X0 _6 ~( T e );& W; s- Q: l: J. l
\0 m* ] I% K. n2 d+ @, n% h9 g
register_post_type('site-wide-notices', $args);+ z* D( J; h2 ?$ l; [' C, y& v/ `
}
4 F% s& p' L# K5 Y' h' Z3 G0 v ```
- p! I/ u& ~* E, @: G! k, p
+ a6 g: \- x1 Z# F6 N% u 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。- X. `# Z6 r% T# |) W. R
$ G6 `: x4 k# p& i' h% k$ l
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
$ u! M5 n4 R3 p' N3 r+ H4 {% i$ W7 ~, S3 M+ Q \
```
{: G: }7 N) w& z: c+ ~& }0 k' O add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
. o9 W- r1 N0 t* a function add_site_wide_notices_boxes() {
8 _* o s9 m4 j add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');$ g+ c1 f- B: S5 n' u4 }! O
}
* z! j/ ?. `4 X. f! ^. {) h! L& h$ V5 x0 c V3 t% H
function notice_details_meta_box($post) {
0 u6 j ~7 I1 U5 p7 E3 f' B0 C3 n. c wp_nonce_field(basename(__FILE__), 'notices_nonce');) f, c- R6 B9 e" V: [' C/ M
$notice_title = get_post_meta($post->ID, 'notice_title', true);
3 o5 @- n2 G" u% N $notice_content = get_post_meta($post->ID, 'notice_content', true);
, s( h+ ^6 l1 W6 a$ P+ |- q ?>
1 B% z; o! Z9 ~0 S <p>! Y1 L" ~; F" P) k3 s: @) r" F0 Z
<label for="notice-title">Notice Title</label><br>
8 I! w$ s; K3 }9 y& d0 M <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
) c; x) o4 ^/ V* r8 l </p>
: p \4 n$ o1 @$ _/ y <p>
" p ], }: k) F+ D <label for="notice-content">Notice Content</label><br>
8 p8 A- l! v% z" ]6 Q <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>" l( | B- u2 x$ w
</p>8 b0 m8 Z& T5 g5 l3 Q- T
<?php/ v# Z; @% U, d9 k/ s" L
}& ^2 q0 U/ [ A4 B
1 B4 O+ z1 O5 {% _. N
add_action('save_post', 'save_site_wide_notice_meta_box');
% B% F& U) c( X9 k3 o( P function save_site_wide_notice_meta_box($post_id) {" U4 g/ e# [$ r
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
- I6 S! j9 c" t1 o. S1 \5 \$ W return;( y3 j; R2 ^! W8 F; G, I$ @
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)* u0 A w! i' m8 K1 d
return;0 k, f' e2 V9 L5 g/ E$ P, u6 z
( k- D* E* B7 {- F! r4 C; j
if (isset($_POST['notice_title'])) {
8 j9 z$ D, H4 ^' M+ V* }; N update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
4 q \6 f2 D' |( F* b6 s: o }- t+ \2 o, y$ y3 e V6 A/ ?- A
if (isset($_POST['notice_content'])) {
; U+ ~ a2 {# v2 f) X7 C9 I update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));2 G# X* |5 C: h3 O5 e$ u- ]
}, n: Q- p! h+ e; L
}
4 l4 }: w3 ~/ j; r( q8 {9 f ```
# v, C3 g2 ~0 m" T( @: Y
# M8 r( E- F# @- i. z 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。- T8 y0 w- ?$ f4 z% }) I
% H( I; f% C) R4 s& k/ _& }4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:) I% @6 n: B1 t% W% l
, n! L: n1 O/ W$ s
```0 c3 R! b2 I) g+ s) r7 k2 M& @
$args = array(6 z) D2 a) I6 z0 o) L
'post_type' => 'site-wide-notices',
2 k! G! Y2 h; o4 f9 J 'posts_per_page' => 3,
* Z. W$ A+ A. q4 v0 v* ~9 j/ ] 'order' => 'DESC',
( T$ h5 R/ b3 i( a) h' z3 V 'orderby' => 'date'9 \1 e7 V2 V2 S4 b: m. @
);
2 C, c; C1 I/ N* k $query = new WP_Query($args);* _7 H* ~1 M) Y! {& E; Q$ E1 y
if ($query->have_posts()) :- @2 V7 C' x5 X% U6 f
while ($query->have_posts()) : $query->the_post(); ?>$ K/ U4 ~7 l- E+ y
<div class="notice">
?1 l5 p/ z% a0 B( g3 ~ <h3><?php the_title(); ?></h3>/ R- I6 h$ ?- b5 l# e) {9 v, R
<div class="notice-content"><?php the_content(); ?></div>0 B5 P2 \& z" x! j$ k& b( K+ y
</div>
4 q. ^4 k8 x( k$ x( a" O% y9 w2 Z! F <?php endwhile;' F" `' C q6 P5 i
wp_reset_postdata();& r4 W1 X9 _. H, }
endif;3 j n: ^9 Y/ Y& z- x
```
- J' y7 [& L1 I0 h
+ i5 c9 u" M8 y4 N8 i 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|