|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
/ I+ S. K1 z( X, Z+ S# b
5 w$ n5 Y* G4 K+ L( q& V如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
0 F; F5 z/ n; Y3 K! R+ }0 Z$ N
, x. N3 `* [ e, t P3 m4 K. i W以下是创建自定义插件的步骤:- }' L. D- p% [4 T. O0 F; J+ Z7 r
% S/ e: \% w% z9 b9 w) M& r/ I1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:: w- ?: I1 d" c& m
3 F3 t! t/ Z1 u! U: X! y9 X* W ```" P, i8 P+ y& o& D/ L x
<?php/ p8 @8 Z( T! ?" x m
/*
) |8 h" D' w( } Plugin Name: Site Wide Notices Plugin( I4 a. A( I; T
Description: Adds a new custom post type for site-wide notices.
' s8 ]4 T5 M# f9 \ Version: 1.0
8 G5 A8 D4 D' G( f9 ?3 ~ Author: Your Name
2 j( Y# i" `8 |1 U8 |% f) c* z/ M2 B Author URI: http://example.com
3 [: a: F9 H+ k5 [3 [, k2 K */
/ C6 L- k* k5 y ~ H
0 Q( k1 y7 x# N // Add plugin code here...
" N5 {! v- P5 a. B: O# A ```
$ ~3 [% U: Y" j$ G: T# D# B
9 o) y9 H, l+ G3 Y2 l0 v 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。+ W4 z, H r1 |6 Z- {7 z( C' U
4 D/ y h8 r" a$ x. W
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
( {' E$ N0 x4 @! O
. H% ~" w, r$ m' S1 ~, W ```. U S( {" Z' [; ~! p& ?
add_action('init', 'create_custom_post_type');
4 U1 W* _: _2 S5 d2 {) w) o function create_custom_post_type() {! c. w& T! Z2 e9 G' g
$labels = array(! w! |' N! X) a1 h6 a. G2 K; Y
'name' => 'Site Wide Notices',
8 k C$ R& J8 N+ o0 J% J 'singular_name' => 'Site Wide Notice',) U% y% D. Z. }' D7 s1 {
'add_new' => 'Add New',
8 F0 s1 p+ Z \2 Q+ W9 L. Q; _) Q 'add_new_item' => 'Add New Site Wide Notice',
0 s2 g. b* q+ \7 @# b O 'edit_item' => 'Edit Site Wide Notice',
, x4 ~& x1 T5 @: e! X/ z/ ` 'new_item' => 'New Site Wide Notice',
+ {3 y9 H1 v, F8 z3 A! x5 ]9 A! } 'view_item' => 'View Site Wide Notice',% Z3 _+ R3 Y$ x$ p' |
'search_items' => 'Search Site Wide Notices', H6 G6 P H% Q$ K0 a; o/ [
'not_found' => 'No site-wide notices found',7 X! N. [, V# E+ D0 }* {$ U
'not_found_in_trash' => 'No site-wide notices found in trash'
9 N, ?2 T+ t* u; H; ] );+ E, k5 N" j( s- @0 a
! e8 M. p) }5 C3 T
$args = array(
, F( T& s6 j$ N. l* y 'labels' => $labels,) _+ d' `- t1 o* N. C3 Z5 `
'public' => true,; ~$ r$ v/ f, b4 D# G
'has_archive' => true,! m- U9 M0 {" U% n5 n/ t& v+ ]
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
' e Z$ m" Y6 w$ b6 R 'taxonomies' => array('category', 'post_tag'),/ W4 c' t; y' L4 _. d) R- a" Y" |
'menu_icon' => 'dashicons-megaphone',
2 }* i* g" [7 W: ~ 'menu_position' => 5,
: z4 v2 L7 T) O 'rewrite' => array('slug' => 'site-wide-notices')7 [7 |! r6 w. C1 a$ |' I t! m, F
);
& X1 G0 k i; v( D7 J9 m, R5 k$ B, U: @. ~4 o, Z5 x( X7 q' E
register_post_type('site-wide-notices', $args);1 O. f Z/ H# k* b1 V6 @) f
}
2 `% M- g( ]9 Z7 x1 T ```
0 V9 s4 {2 d; v+ _* I6 [% t8 x) T2 E0 ? c, |* S# K
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。# d/ O7 w5 G7 A. d
) A0 y; Q, F6 s% v9 S% c. \) U3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
# g" _1 N {" K3 ~$ j3 p
0 E6 ?9 x+ L% R% c4 [ ```' ]% ?9 ^. b+ H6 y# c3 D T) M) G, a
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');5 [: z' K9 R+ p8 V
function add_site_wide_notices_boxes() {% M5 U# k% P4 v% R; }4 s( ^$ Z5 X5 o: R
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');) b8 ~( Y4 j0 h: w
}5 L R @7 n5 R) k
5 Q9 h8 g3 F9 q9 t$ j function notice_details_meta_box($post) {
/ W! k# _! g. c# g6 g* O wp_nonce_field(basename(__FILE__), 'notices_nonce');
+ C$ M8 h, G4 f2 o. ~) T $notice_title = get_post_meta($post->ID, 'notice_title', true);
: N9 A2 Q. ~: ?$ Q# B& j. g* x- C- l $notice_content = get_post_meta($post->ID, 'notice_content', true);
6 d& j" w5 n" B2 E6 i* K# l ?>
. h1 z! e& x: y! Q* l2 o& c) R <p>8 ^+ r. T* H$ H; p# |
<label for="notice-title">Notice Title</label><br>
0 a4 D9 r- w, W g/ ?' v1 W <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">$ ^: V1 |0 P( X& p2 u
</p>
* U& ]5 @& W8 @ S6 V& } <p>2 h1 a0 s9 ^8 r. i9 @" r! [8 A, c
<label for="notice-content">Notice Content</label><br>+ a5 w3 c) o" F7 u' z* l2 S
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>1 J, J( \5 m* P( Y) q
</p>- S" d: N. Z2 h. t4 q
<?php
5 v) D2 F: Z' q }
; P2 j/ o+ T7 K9 j3 h4 h' u2 [' O# d0 c
add_action('save_post', 'save_site_wide_notice_meta_box');- w: P& W0 `8 H x* Y
function save_site_wide_notice_meta_box($post_id) {
, S! E/ l; r/ u: Y. u if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
4 q+ d5 V& X; W, m& Z4 ? \/ q return;" {' l) Y0 K ^/ L% s/ _
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)0 t* N5 P6 |1 `! }; }
return;' w! X' t8 ]3 E* `
! b; B) Q( O( |9 d$ ^) r
if (isset($_POST['notice_title'])) {
' v% v: f5 z- Y: H; P update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) m4 K! o* J4 y m3 A% A
}, y) G* q6 H5 l {& [. m
if (isset($_POST['notice_content'])) {& X" S0 {) X& I' N! P9 R. c
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));9 I" q' D/ g; k* v. @; k% f# C
}2 N8 [7 ^3 f, O4 q
}
( F+ N3 X# c6 L) s7 r, k ```
7 Q/ i* E1 }; K! Q: a$ ^1 U4 }1 `$ [( H" h. `7 t
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
: }# ]8 ^4 @2 s4 u! H9 `& @* v* k0 j6 y
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:, B' _) q2 @! ]9 u! Q+ E0 ~ N
' ]9 {/ \) c1 H. f4 ~9 v ```; U$ u8 c/ b; c$ A; [1 p
$args = array(
# r. P* D1 W& w: A 'post_type' => 'site-wide-notices',
2 X9 d9 v. p# G! t! W! d- m# _6 T2 n 'posts_per_page' => 3,
7 S5 Y ^1 U8 v* D( d0 c 'order' => 'DESC',
- X; J) e) y4 e8 o/ {/ E$ }/ E/ } 'orderby' => 'date'3 d) {; F/ A! h5 h
);* \4 M% q, r3 Q5 B
$query = new WP_Query($args);) v# F$ P7 q5 {$ C: q# t" I
if ($query->have_posts()) :
- R( _) M# t, |6 d6 c! q+ [4 U while ($query->have_posts()) : $query->the_post(); ?>' R( T* b6 B9 S. I: c
<div class="notice">. a3 o! E3 N7 A" `
<h3><?php the_title(); ?></h3>
9 f! a: A- i+ C1 k$ B) R) Z' k2 V# e# I6 q <div class="notice-content"><?php the_content(); ?></div>
G- Z+ G: }) g h) B% _ </div>, Y B: f6 C: p- `
<?php endwhile;
% p- `7 W M- @8 Z: E9 p wp_reset_postdata();3 ?" Q# ~& {, w( y7 q. ^
endif;+ A; T% U0 A" u/ E6 r' e
```
1 v% X n4 x; `- c* D: ]5 l2 f
% }# g# s& w7 Y9 X' C' E; S 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|