|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?+ C. v$ h. P2 T6 \, n$ U' n# v
/ \% u0 e$ ^( Z$ p9 R b
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
, b7 ~+ b, p6 D) i2 E8 w6 R, r7 o" v+ U
以下是创建自定义插件的步骤:
1 P# K; O6 M1 J5 ?/ {+ V; {5 R- v. B
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:5 o7 z) q) ]7 O5 o1 m- j
6 }2 H. S4 H6 q3 Y
```* p: _+ N; A! F6 P# E
<?php8 p/ N8 m: k3 r; i6 Z( U9 o8 D
/*4 p0 \% r! b+ X( v
Plugin Name: Site Wide Notices Plugin
$ L5 _1 }9 y- r Description: Adds a new custom post type for site-wide notices.
/ N: M) k5 ~7 m" s+ c Version: 1.09 Z$ v X. M9 E- F! W8 P, t
Author: Your Name
+ M" x/ _/ \2 b3 h" Z Author URI: http://example.com
( j2 v e0 D- Y; \) k& u( U) U% Y */( `+ R' C& c0 [& w! D
" {3 r7 i; h; H
// Add plugin code here...* a; z5 a4 B% B2 u6 _7 B. G
```
9 K, d, i* y7 {% B1 J4 u" a- y3 A. X: @; V h0 c
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。! w( T! W% w$ N+ L8 Q
4 n, x0 u1 Y9 a) t, }# X2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:3 D9 l8 k9 g: y
' A: C/ \% s/ ]4 k# i
```
4 j( G+ }3 o% U2 Q' F; J2 j add_action('init', 'create_custom_post_type');6 `. b4 p3 J9 Q9 a3 R
function create_custom_post_type() {
! t8 E/ ]: k; \! T& x $labels = array(4 l( K+ C3 p- a, ?" F! L
'name' => 'Site Wide Notices',
& R- @! W3 B& p" \2 w0 h 'singular_name' => 'Site Wide Notice',
8 R$ j$ B7 t( R7 g5 c+ M 'add_new' => 'Add New',! C. D j( h8 q2 Q; a
'add_new_item' => 'Add New Site Wide Notice',5 E9 D3 o: X5 |/ }
'edit_item' => 'Edit Site Wide Notice',; H( C5 G/ h+ B1 w8 f
'new_item' => 'New Site Wide Notice',
; I1 N! _, z* u2 C/ G 'view_item' => 'View Site Wide Notice',
# F. C9 q9 A- \* M 'search_items' => 'Search Site Wide Notices',
5 ^0 o5 c% ]1 ? 'not_found' => 'No site-wide notices found',6 l/ D/ {/ i4 h1 h5 D
'not_found_in_trash' => 'No site-wide notices found in trash'
4 M7 ~: S; y, s. P6 F8 Y4 S );8 X( [" }1 X; i9 i; p0 ?
; D' s% A! }& ~. y3 v* Z: \- x
$args = array(2 w: U+ E& Z& O
'labels' => $labels,6 b/ t7 [. w: Y' P0 f. s
'public' => true,
7 p. P: b8 j8 ^: E a$ U 'has_archive' => true,* I* x1 s3 d% R# w8 q/ u' `
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
: v0 O8 f1 D6 z. Y' B% a% Z5 d9 p- Y 'taxonomies' => array('category', 'post_tag'),9 e: L/ g* R% ~- |# l
'menu_icon' => 'dashicons-megaphone',, [/ Q0 j% w; R
'menu_position' => 5,. v' R8 V# K: [% C( i9 n, C% W
'rewrite' => array('slug' => 'site-wide-notices')" |! T$ S! I3 D. H0 \0 l
);
/ I- V+ E8 x$ n. h b, G8 o& j! z+ A# @0 r, k8 f9 g0 G0 ~9 G
register_post_type('site-wide-notices', $args);
& i+ s" ]9 B1 x% y }$ Z' t, c1 ]5 b& @- t
```, t( y3 l& n' d- N; _9 l3 S
/ b) _7 ^& I7 E) P
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。# H) j' m! q5 C/ a7 G. }! i4 B
- g! v/ {: H% D6 r S" y3 ~ ?3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:) ^4 O8 W9 V% R/ `& F6 t
" \, A4 h" }0 L- T7 v9 @ ```9 ^9 w. N( u* U+ c2 R- j
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');+ n: Y5 L! E. ^ _2 p
function add_site_wide_notices_boxes() {
3 N' l- U$ {- Q/ N2 m add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');; x! Q8 p# k) i$ E# |- U; `9 k
}8 n/ b& R: m2 ] @1 }
* b4 c7 n! D7 h; u
function notice_details_meta_box($post) {
& w( ^% o. w4 U0 i wp_nonce_field(basename(__FILE__), 'notices_nonce');/ ]0 F% F6 u' A1 z
$notice_title = get_post_meta($post->ID, 'notice_title', true);
# B7 A# q" n' \$ [8 u $notice_content = get_post_meta($post->ID, 'notice_content', true);5 d# s. }& c5 X; J
?>' e; O6 C& D7 R" u1 ?
<p>! R# q) Z3 r% P
<label for="notice-title">Notice Title</label><br>! j* k- p3 Z" r" D0 G
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
+ S* T8 Q" S, G J </p>/ T* g1 j3 S: }/ c4 l
<p>
e& x4 C1 d6 d+ r' I <label for="notice-content">Notice Content</label><br>; m7 u8 a W5 O f
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
+ j3 }. f( y4 }0 Y </p>
' z" V5 G5 U# p5 K <?php/ I" n; u4 Y( E4 H3 j4 ]# b& |
} j3 F F0 F+ E$ z
3 S8 [0 @8 s @# @ add_action('save_post', 'save_site_wide_notice_meta_box');5 P" _7 S( D9 K2 J; Z3 W% H
function save_site_wide_notice_meta_box($post_id) {
' T8 Z* N: \% @2 C/ M if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
9 a0 O. ]7 v: z3 ]) _, f ~ return;) I! T# G5 P$ X! j4 b. a
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
; F& c# C' D( u return;
6 P$ D; t& q$ \" b% d' K& q h1 } o* x1 n( B. A
if (isset($_POST['notice_title'])) {5 A" v& M; b0 X, z+ d
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) [/ f) [- F+ l/ K; `% {3 z
}
6 O2 e) W A) K: U( S O if (isset($_POST['notice_content'])) {4 V+ |( U$ ~7 {4 A
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));/ @# \. k: l# H8 P: r
}
2 g* B8 i Q9 O4 T! j& I }/ H1 t6 k4 ^3 E+ r
```: {( l; E5 z% ~3 W2 @: k
2 r# h# h: q4 f( L
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
, @! j5 o3 `! p2 c, U( C& e( r9 u
- y# G5 D! `4 s% Z4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:9 g2 _7 ^ u! W+ B
( @$ G+ z' L1 w& A ```
/ i7 H! j% W3 e( y1 m+ G0 W/ [. Y $args = array(
4 U5 u- c L3 K 'post_type' => 'site-wide-notices',
& W9 C; b$ \ f7 E! J4 N0 O 'posts_per_page' => 3,
4 F; r' |. u1 E, W* Q 'order' => 'DESC',2 \. O/ l9 \, F4 \, k4 v
'orderby' => 'date'( E5 A3 U2 U' P( p
);$ z% l( u, t8 y/ y: B* K
$query = new WP_Query($args);" t+ ?, v7 H' F( }
if ($query->have_posts()) :5 g# V! _7 B0 k! i
while ($query->have_posts()) : $query->the_post(); ?>
7 @7 H* S: N L/ d. Q5 i <div class="notice">
9 v$ z/ {% z+ e" @- P <h3><?php the_title(); ?></h3>
# b! ~- S" {; I3 a( e% a* Y' A <div class="notice-content"><?php the_content(); ?></div>% n, Y/ v4 j; B% X
</div>* y3 Z- @: i: x1 L! k# Y' X' I5 S
<?php endwhile;
- {. j& ^. h1 }. _. p wp_reset_postdata();# S) Y" \, H# ]
endif;
- J. }) ^+ a! v& ^, O+ N1 L ```
/ g/ i6 z: Z/ d9 {" u# ]9 \8 g5 t) t8 n/ C# m6 Q, W8 L4 v
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|