|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?: x5 b, }% ^2 i; U& I* u
( i2 c H# h3 l8 U4 b如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
9 N' g2 T- w& z& [! I1 c
$ a# \, [6 {+ U; y以下是创建自定义插件的步骤:* F: Y% P" i& Q3 ]4 Y
3 e' I4 n) \: x7 B5 b- g
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
, f; M- p! s8 O0 o# W8 T6 j- N. b7 M
```6 G, }" b: X( m/ f! `
<?php
5 } }5 Q/ r; m/ Q /** k% ]9 Q* ^- U: B: K) z
Plugin Name: Site Wide Notices Plugin
& y5 {( r* e3 ?# d$ r) v) { Description: Adds a new custom post type for site-wide notices., o) P# l% }- C% a
Version: 1.0
1 o1 s6 z- m8 ]% U$ s Author: Your Name
/ L! }, s. I/ G9 L% d Author URI: http://example.com/ C6 Q. ~; p* j1 M
*/
; `7 N0 j, L1 k* r9 e3 M4 ]& x
) G" z. o8 {, k, a# w3 V) @ // Add plugin code here...2 r) B5 Q: n( T) d
```5 I4 r7 j: v# g' D- q) D
/ k, {5 T' Z2 m
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。% r) }6 t7 c, v( b' M1 [8 g
4 M, k0 }+ S3 g7 s3 i3 }! Y, q$ L2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:/ T/ _0 g: A& S
$ @1 |7 N, t4 k j; }8 e$ q- K- Q1 N ```
2 K0 L9 D L/ m" i( k: D( B add_action('init', 'create_custom_post_type');9 X5 u( B, q: @2 `2 |0 \8 [) _
function create_custom_post_type() {6 B6 U$ `+ E- p1 G' N; O: j8 M9 X0 Q
$labels = array(, W# Q1 c6 P! D' w! s
'name' => 'Site Wide Notices',
+ C7 i. V. K3 e1 ^+ c% e 'singular_name' => 'Site Wide Notice',2 i; s6 E! Z* {) u% S
'add_new' => 'Add New',6 f: n5 F, k L7 g/ @* u
'add_new_item' => 'Add New Site Wide Notice', e% k2 T. g6 u6 t/ s# ]! z
'edit_item' => 'Edit Site Wide Notice',
) a% |% m4 i, p+ Y% a4 b 'new_item' => 'New Site Wide Notice',# b7 _( M( y1 p
'view_item' => 'View Site Wide Notice',
6 C# d4 o3 l5 J: w* i& `# y 'search_items' => 'Search Site Wide Notices',
" W" D6 J5 k p. |8 x! d 'not_found' => 'No site-wide notices found',
+ {6 V6 S- H/ U 'not_found_in_trash' => 'No site-wide notices found in trash'. _/ b# h; N& P9 q, Q% j% }
);
8 k: S! D7 ?4 y( N3 F7 o' s2 A: u" Q; }# J# u
$args = array(
1 X- \3 y* i( I6 F 'labels' => $labels,
, M4 e7 T- T8 C4 f- g. v: k g0 ` 'public' => true,
! Y0 a m; M: d1 G 'has_archive' => true,! n! }0 F8 m' z9 g: R1 n
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
2 i9 Q4 J* k1 p" q. T; R& H 'taxonomies' => array('category', 'post_tag'),& l% _$ M: N6 A K
'menu_icon' => 'dashicons-megaphone',$ Z; c" A% h3 z5 d# x$ S
'menu_position' => 5,
) I% H( ]6 [, d% ?4 Z 'rewrite' => array('slug' => 'site-wide-notices')* ^: X5 W+ l9 R1 P
);, D2 L6 {+ B; Y: Z+ P8 T
( N0 P! @6 G* d" q/ ?
register_post_type('site-wide-notices', $args);1 F$ G0 q$ l/ m9 S& U3 z
}- }) V8 V. b9 x o
```
9 k: G2 U0 r3 p) B) i
( a ~3 q0 E- M% {- t' x0 k0 C 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。# g5 o4 v; d r
0 u: j0 M0 E% y* _3 V! o; f" D' x
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
) h& s* |* @" ?+ J: C+ a
; U0 z8 h% j4 B4 Z) q ```3 A4 q8 s: X) }9 T
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
3 W( l4 }+ _. ]' V$ Z function add_site_wide_notices_boxes() {( B' S) i6 t7 L/ ]. q* O5 l
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high'); m. Y( o' r3 j% R% `1 [! Y5 t
}
5 b8 n9 ]# A$ |$ V/ a6 L! ~( J K9 ^ G& m& F
function notice_details_meta_box($post) {
1 b- f, K5 Y3 U5 J wp_nonce_field(basename(__FILE__), 'notices_nonce');
/ l1 ]- R; ?8 ]" R! ^6 X' G $notice_title = get_post_meta($post->ID, 'notice_title', true);
* l9 ~, ?. I; Z $notice_content = get_post_meta($post->ID, 'notice_content', true);8 C( v( Q1 Q8 r- W8 [& N/ m, F
?>
- \, E# t; m5 E8 H4 Q- K3 _ <p>
1 Y; a0 N, {' }# h3 s <label for="notice-title">Notice Title</label><br>" p0 z/ q$ A. ^" J% V& e$ s/ c
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">) c( z; U- R8 p8 u' L* ?
</p>
* ^( O6 N1 E9 w. K. |: d <p>2 P7 G: L# V1 S+ f# n& \& l
<label for="notice-content">Notice Content</label><br>8 Z$ c) `/ L5 _$ R7 i
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>1 l. Q' M7 i0 m5 o/ M
</p>
$ f- u) U9 z; ?1 z" P3 M1 w <?php1 P5 i# M& i6 F* F/ T5 J
}
% `: D U/ _1 G8 g% S
3 M9 D: c2 z5 N add_action('save_post', 'save_site_wide_notice_meta_box');9 d, w* g; x0 X& j& ]. C, \4 k
function save_site_wide_notice_meta_box($post_id) {
8 v+ t; q( y- ^( |5 V+ { if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
Y; W/ {& w6 R return;
i9 ?4 ^$ g5 I) b if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
t1 H9 ^( H3 A" M7 u! ] return;+ R4 {1 @! Y; \+ y# u. z, v
% W9 Z- g; H! ?- [0 n+ T if (isset($_POST['notice_title'])) {
: M* l( [+ J5 Z+ P9 p/ b/ f8 X update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));8 `7 h7 v2 D# M, N, E7 w
}
4 x( P4 b/ b, }" l if (isset($_POST['notice_content'])) {0 y+ L; U; l; \# W
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));3 Z( m1 z0 _ y3 `- F
}7 \ V& g) L+ k) m7 c5 p6 v
}0 u/ f; }3 ~3 F, b/ @$ \
```
$ P; U2 q( @3 E' K) a7 c/ n( ?4 z
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
- Y' P) A( k# q7 p( {! f# B. w. Q/ K
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
2 w5 m/ e: |5 R$ x \9 L. K. I9 @& b, K# F, D
```( T! h" B4 K( s* f4 ?8 X$ f6 q! n
$args = array() z& N+ |, ?8 Q: ]2 [& ?
'post_type' => 'site-wide-notices', j5 S% f- V- J( K. U6 a
'posts_per_page' => 3,
+ |! j; z% q) q* x( ? 'order' => 'DESC',
@3 s" a5 H2 \9 @ 'orderby' => 'date'2 I) {/ G4 Z3 f; Q( ?6 X
);: t; d: E) Z' Y5 v: t
$query = new WP_Query($args);7 j# M% R0 s @# P4 J# |
if ($query->have_posts()) :$ a( [7 }9 y8 H' j* R. t+ l
while ($query->have_posts()) : $query->the_post(); ?>2 F) R3 c1 ?6 {7 l
<div class="notice">
C$ ^) F5 |) ? <h3><?php the_title(); ?></h3>: t* ~" L; P9 L
<div class="notice-content"><?php the_content(); ?></div>
8 @4 M5 @* @3 R0 x3 H# Y5 ] </div>1 Q+ K' @4 n9 e* E* J) }% |+ E
<?php endwhile;
0 ?$ i5 P8 r* y; R5 h( ^. k9 S( x6 u: t wp_reset_postdata();' `( [+ c- S1 Z2 D- X' p
endif;
5 t( b9 A4 v( Z4 w& Z ```
% i8 \8 |( X7 K3 h. d: s
' q9 |: s- P" n5 \) h 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|