|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?( K8 B1 I9 h Q! p. C1 _& M, d
9 v* a- S9 T+ ]& W& D) |! u: L1 w; H) V; \! S如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。2 D U! u! [4 F4 p# [
; D4 s# k4 |8 v. Y8 ?5 b8 m
以下是创建自定义插件的步骤:! W/ P( c# L1 ~! O4 M+ @1 ]
) w/ E H8 \0 M2 M( K: I4 o1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
5 l# q0 m6 _/ I/ y, m$ i. ^( u# A/ Z9 M1 ?+ A
```
' e) o+ h0 s/ ~% D) \1 c <?php
v+ @. h) o8 e4 I% d, F /*
% u; |0 m" y' s! q5 a Plugin Name: Site Wide Notices Plugin4 x9 N. `/ |/ I3 g6 a4 @3 l$ ?
Description: Adds a new custom post type for site-wide notices.4 U; O8 p( D1 z) G" \
Version: 1.06 v( Q) S9 T1 K7 Z7 J) _
Author: Your Name
; {% E9 {) l$ E+ D# b9 ]; n5 m Author URI: http://example.com4 _* v8 d( [2 F
*/& t' @0 \. h% ?0 ]8 U
7 l& o9 D4 y: g5 X0 `6 s1 R# C' W
// Add plugin code here.../ o# ~ W9 C$ ~- q
```
; u5 `. b8 X3 z- L; T1 S7 ^+ I; t5 Z' [0 v
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。- A( w+ E% y8 o! |) R
" H {5 A4 s$ W n& D# F3 w" l f
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
6 ~2 ~+ m, m; E. g3 V0 C ~7 a* \
0 i( z6 X5 F! _$ R) f& F' p8 j$ k ``` I0 y" P7 q8 O/ C* ?
add_action('init', 'create_custom_post_type');% q* f: i5 L$ s& Z# i
function create_custom_post_type() {( B3 K f" J6 D0 h3 @
$labels = array(6 g. U- W! B1 R5 G: [/ @
'name' => 'Site Wide Notices',# c4 V7 p/ G, Z4 {7 J2 h
'singular_name' => 'Site Wide Notice',; D3 J h3 W- q7 I
'add_new' => 'Add New',
" ^1 M$ _) U' w+ V% A 'add_new_item' => 'Add New Site Wide Notice',
0 q$ q* P' e2 d0 c: g$ S+ P( ~$ k 'edit_item' => 'Edit Site Wide Notice',5 O! h' l: f- K3 X5 G* s+ V. E
'new_item' => 'New Site Wide Notice',1 U/ t; [3 E! R+ v
'view_item' => 'View Site Wide Notice',
3 s. K# Z# Y! _1 k- ^. l" S) g 'search_items' => 'Search Site Wide Notices'," u9 W2 C7 D4 F0 M1 b7 }
'not_found' => 'No site-wide notices found',
8 m" n' r; v" V) i 'not_found_in_trash' => 'No site-wide notices found in trash'0 N0 q; ~- t$ U# C' b4 s
);1 v5 Q6 h4 ~! T+ w$ d) ^8 |2 O( O
3 G0 V' v& D. Y* e y$ f' z $args = array(+ W C }: J: A/ ^8 i
'labels' => $labels,1 r- o P* P x" c- F
'public' => true,
1 `$ i- E: U: {+ v9 d) P 'has_archive' => true,
. a1 c1 {. E1 }- f! b" r% u/ j 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),& h# Z: k! L4 m" G
'taxonomies' => array('category', 'post_tag'),+ `$ d% @& N4 A' }; `1 q9 e
'menu_icon' => 'dashicons-megaphone',
1 b; k+ i. @& r 'menu_position' => 5,
3 }: q$ ]$ x$ E3 u4 I" V9 q7 C+ l8 M 'rewrite' => array('slug' => 'site-wide-notices')
/ m( D8 @+ n9 ^- f* u );' M7 h% Z* Q' I# @+ v9 B- Z
# G0 H, C- p/ k, \1 V9 t7 ] register_post_type('site-wide-notices', $args);
' R0 F/ p: e5 \5 A0 L }
: [; {, D7 M6 Q7 `8 c, f( M- f ```
. u4 B2 ?" v5 J0 o
, Q$ T$ z# e$ f- u 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
' w5 k* q, {, x% d! I
( U/ R* q0 I Z3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
( y# Q9 U3 M, I" L1 W. Z1 a
: H, d/ n6 j4 j, U ```5 f% Q9 h1 |. o( E! F; D5 x
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');+ Q( ?/ M- Z! u6 W
function add_site_wide_notices_boxes() {+ o6 {' J; }" Q2 i7 D: ]6 ~6 p
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');- P0 N9 S7 I2 B- ^, C
}# T0 ~1 O( q `3 g g
, l4 Z) R5 _4 o) P- e0 G5 h6 I function notice_details_meta_box($post) {
+ e5 E _2 x: C+ I/ X, F wp_nonce_field(basename(__FILE__), 'notices_nonce');. { N3 f/ ^2 N* Z' {9 b
$notice_title = get_post_meta($post->ID, 'notice_title', true);
( g2 d% y6 U9 t4 c9 z( Y; C $notice_content = get_post_meta($post->ID, 'notice_content', true);) A/ i7 p4 _$ D& h
?>* }' x4 R$ I, A& j' O5 o
<p>
8 W9 O) H% j7 s' n/ K% n9 r4 y0 S$ L <label for="notice-title">Notice Title</label><br>( X9 r3 |2 a3 ~: r) E6 H
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
* r# J7 L& R0 M- ^. @# ^ ]4 g </p>2 w- Q! |+ _2 e# ?8 ^
<p>
2 a ]0 t4 l: b+ _ <label for="notice-content">Notice Content</label><br>- d0 l' T8 ]; r5 }
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>8 }" D) w* i+ r8 V+ i' }( G& S
</p>
- N; @ A3 j+ }* r2 v- B$ x. h <?php4 I' Q }8 ?+ o' \* L
}* m3 v( |" |3 D% ~& @2 C; `: b
' h; E9 l5 m+ q5 ~+ A9 n8 m
add_action('save_post', 'save_site_wide_notice_meta_box');
4 U! F6 x" _8 h$ @7 K# L3 r function save_site_wide_notice_meta_box($post_id) {
( Q9 S# X5 d3 y8 F! \ if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))): N' [4 E1 `1 }5 p: _' {
return;# @$ O' i# u" B0 W" f! _
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)4 T/ d/ E F) @* V0 u6 }/ g' C
return;" S4 h# x, i# x2 ~6 u
) s$ G" [; v/ a' h" k if (isset($_POST['notice_title'])) {0 [; f1 p5 ~/ y( ~/ m( @: [& E- ?
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));1 k! U3 @1 k& O! v3 v. d
}
: [. S0 @! P$ c- {! {7 V$ e if (isset($_POST['notice_content'])) {
: }. ]2 s! a( Y0 q2 c update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
: K) O9 L) r$ d5 O$ [# B2 |( I' D9 V0 p' q }* @5 v1 }0 [8 s* Z2 |* m: k$ l( ~" {! V
}
1 [) f3 o) D( |; A# Q0 n ```6 v& t* u: y1 W6 d9 |7 |6 Q
9 U4 C9 E1 o* g8 \) z( p
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
9 U7 j; y" _2 H- {. ~* ]) W
/ B/ h1 g2 q% ?. N4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
3 c$ S. y8 |% E% a& t2 T
5 J9 E4 ]% b/ q! d, t5 R) ^. [ ```2 V! q) D6 S X7 k7 i. u
$args = array($ h# g0 D* _ }/ h% T Q2 n! E3 ]( i; q
'post_type' => 'site-wide-notices',
& g+ O5 b' R- a 'posts_per_page' => 3,& x5 a! g; E! d( f
'order' => 'DESC',
- F X+ v ]* v" v% f 'orderby' => 'date'
# m1 i! K- \5 ~, P3 i% k* \ );
3 p X! F8 t, ^( A. u $query = new WP_Query($args);/ n/ b |; _2 S: ^2 x" v( l5 s5 t; i
if ($query->have_posts()) :
$ R* B- ]0 x4 y5 Y& Y2 I3 S2 n while ($query->have_posts()) : $query->the_post(); ?>
6 r6 h+ ]$ ^; x3 O! Y <div class="notice">- |' u) h5 C/ _; U7 R' r$ T
<h3><?php the_title(); ?></h3>
; j$ h' D+ ?# B1 `+ { <div class="notice-content"><?php the_content(); ?></div> E3 B% z" `9 a
</div>3 ?( v1 V# W) L' F4 E* q, w
<?php endwhile;
4 C- V0 [) q$ T U' v: Y5 R wp_reset_postdata();; }' {0 O" y3 C
endif;
; k, }/ [; S6 o3 U- w# \ ```
6 w0 e, A+ i/ O
! E7 y4 e$ K3 M: ?# `* U5 f; Y$ a 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|