|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
( [8 g& ]; ]* ]) f
2 \* C% Z( a; `' Q1 R+ D0 m% Q如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。& c Y& Y+ n7 ~ i
& _/ a3 X8 q) |) Y& B以下是创建自定义插件的步骤:+ Q0 |$ k- r; {
# G$ |0 D9 z5 D' j1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:2 R2 y' [2 r4 t) Y2 n$ ^7 C
7 y& m+ T" @0 v# e ```
8 Q" n' f+ r; M j& j <?php
) a. ], I4 `% }% z /*
; r" g. ?+ A: Z Plugin Name: Site Wide Notices Plugin
! O( n; D; _/ N7 a Description: Adds a new custom post type for site-wide notices./ q4 d& s o/ l1 f7 j
Version: 1.02 D- g( [5 Y8 p, _) `0 {) \0 M
Author: Your Name3 J* g9 O, b( R( _1 Y
Author URI: http://example.com0 m2 @- j' y R. B$ N" N
*/
0 {- g8 p9 ?9 K( P" X3 }- p1 V9 u; O( v, F8 K$ j
// Add plugin code here...
2 I+ l) U& M3 W2 ^, Q ```
' e W: R9 M3 m h" E. M$ w j
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
: K8 A9 x7 q3 I- t. a: _. B
- F' t: r$ G$ p; a, |2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
% D5 E# F" O$ W, j) ]
8 L5 [* k4 ]. n ```' C- l( t& b6 d4 ~0 Q k6 H. _
add_action('init', 'create_custom_post_type');
$ D v0 ^/ C+ L" l* X5 y0 ], S function create_custom_post_type() { s3 L9 t8 A. S5 o& Z
$labels = array(
( B7 C' v7 K" u: f# n- D 'name' => 'Site Wide Notices',: _% C: f3 r/ c( n: M& M, ^8 U {
'singular_name' => 'Site Wide Notice',
+ ^* v+ v$ o T. x 'add_new' => 'Add New',+ E0 ^# h6 |5 e6 S9 L
'add_new_item' => 'Add New Site Wide Notice',# s7 y9 Q* {$ _! l& V
'edit_item' => 'Edit Site Wide Notice',
$ ], C' ?! |% k+ d 'new_item' => 'New Site Wide Notice',
, j# ?$ Z F( n! Z' j& m3 y4 q+ I; n 'view_item' => 'View Site Wide Notice'," @7 f6 m+ L6 ~* d) R/ c
'search_items' => 'Search Site Wide Notices',# l) K4 q3 k1 O& b3 E
'not_found' => 'No site-wide notices found',
4 |8 y5 {% v" Q 'not_found_in_trash' => 'No site-wide notices found in trash'
, k0 X# K7 {7 @ );
, M4 T K0 V2 w- ^6 W6 `" _8 ]2 r R/ A# I' \
$args = array() l' k, c% N/ }% w
'labels' => $labels,
+ ^6 q8 W" K0 _0 F 'public' => true,1 J% J& j* q+ E. x1 V1 l- w
'has_archive' => true,; v: {* W6 G2 e3 j; V) N% S
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
6 o& e0 W$ {. A" _ N* @! a7 b/ m 'taxonomies' => array('category', 'post_tag'),
; R/ {% P; V( M, s$ D @ 'menu_icon' => 'dashicons-megaphone',
8 p0 K: a( G) p- U4 F* Q 'menu_position' => 5,
) Z; D) \1 U3 k* A( @ 'rewrite' => array('slug' => 'site-wide-notices')
0 }7 b$ {& |# p. t6 q );
- t5 A6 F: E3 W' v2 V0 N
. Y8 [$ Y1 H. Y3 G register_post_type('site-wide-notices', $args);
2 @+ A& [% X$ M3 k }
# t: m& Q9 |; w( _ i ```
. {- z" V1 ]8 T$ G4 H1 K/ S; H
, s; n! w, M8 R5 s5 e6 w2 W 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。* @: c4 o4 g J$ N
& W( `; }+ L2 N) P
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
9 E1 W v/ w9 z/ E* v
8 @% u' l: g9 ~" m ```# {0 W' e3 p* f, B+ m
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');# B3 x& n7 U' [7 O5 p; X; D
function add_site_wide_notices_boxes() {
: A/ w" S, W* K. E. [" w- F0 d add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');' a0 s& u- ~! e$ h! z6 O
}$ k) l3 m' M7 l( Y: H9 d4 _
9 P V# U& U ]2 [" m( i2 g0 ^, {3 ^- e function notice_details_meta_box($post) {
, x5 w# x/ V$ ~* f, z& P) K' O7 ] wp_nonce_field(basename(__FILE__), 'notices_nonce');: c u- S- V( x! M/ {& T6 g
$notice_title = get_post_meta($post->ID, 'notice_title', true);7 B' f0 K9 G* Z" R0 t, v8 {
$notice_content = get_post_meta($post->ID, 'notice_content', true);
# J+ B3 e/ W0 i+ @; C0 q* ~ ?>
6 K. W$ ?/ J& c# }# h* Z <p> c3 s9 f! n& B% R4 V0 i" E. r C( T& T7 H
<label for="notice-title">Notice Title</label><br>) M9 \$ e" t( T5 ~" x8 \
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">1 d }: r) q* F" \# }
</p>
7 C I) o/ A t) s8 e4 J <p>
; ~3 B6 s7 L7 @ <label for="notice-content">Notice Content</label><br>' v8 B/ O! _% R* l& s
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>; D( y) N4 L- P" x
</p>
$ Q& J% r* _* i+ y7 ]& V! I& K/ O <?php8 o4 I _1 b; J' |* x# d
}8 w8 X. ^* E/ v2 z2 [' e
, s/ T2 s- V4 S6 e$ C# @" S( t add_action('save_post', 'save_site_wide_notice_meta_box');/ r* {( T! d6 a* D7 r7 @2 z
function save_site_wide_notice_meta_box($post_id) {4 c/ H* J& i. V$ ?
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
! @/ ?1 j$ u! P* x) y8 {; A return;
+ [- f, F: [3 y3 i/ F- _ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
5 F5 A5 r/ ^+ C+ a4 p5 t1 i3 C' _ return;9 W$ W* q7 {% ?6 v! Z6 ?6 B0 [
% e& g) a, R8 y i9 } if (isset($_POST['notice_title'])) {
8 b% v. e+ u" o# S5 Z5 J& q update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));4 c' M+ X5 n3 H8 q, [, i% J/ ~3 X, E
}
4 P+ s- i \& E9 x, b9 A$ t if (isset($_POST['notice_content'])) {0 c& m7 {: w9 M6 O+ |, w3 x; P
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
+ Y1 p" n- ]( E' M }
' L% X; S4 P2 k# _* U+ J6 P }# n) ?# e# Q+ z" J- B
```: C! U# x v( M( ~+ ^& [2 U$ Y; L
& H0 q+ w ~9 o
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
9 W- `1 Y. o. F9 N* r
; X+ V+ d6 X4 H1 o6 ?/ I4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:' Y1 | A( u& N# w/ M
# E$ E- q( a, @ ```
" S) S( M3 ~8 l* l5 l $args = array(
5 w4 |" [3 O- a0 }/ i' ^ 'post_type' => 'site-wide-notices',
5 t- u3 H# s0 K 'posts_per_page' => 3,4 ~" m4 z& {. g* m% p- L) ?# v
'order' => 'DESC',, j n) K" }) k' w0 _6 Y
'orderby' => 'date'$ n2 D: `; D9 W# y B
);
4 [7 ?7 y7 z+ ~% ~' n/ ] $query = new WP_Query($args);
1 h8 r6 v, O* n$ n. Q) U if ($query->have_posts()) :0 V6 w& ^" Y/ w9 {# `8 G
while ($query->have_posts()) : $query->the_post(); ?>
2 O! i& I* j2 r9 a$ @ <div class="notice">) C6 u6 _* m! j1 c
<h3><?php the_title(); ?></h3>
2 V* u* X8 e. e! f <div class="notice-content"><?php the_content(); ?></div>; ]( q9 f- q6 d; K0 k+ ~- n
</div> h& V- D1 \. o9 ~. s7 |7 R
<?php endwhile;
' `* h E' Z* F( i" j% Q wp_reset_postdata();
& @, m Y; K% V+ v8 a* B* ~ endif;! V& |6 N2 F8 t6 h& x; t
```3 @' s2 A' ~7 O _5 B5 o
( @+ a$ S) S7 J4 v. z" e U
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|