|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?/ w) K, V& J8 {3 ~ a' ]
, q6 _3 m" p) S如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。; G5 { ~' `' M( g9 U/ t
8 Y; Z7 J4 p/ v5 V+ x4 E
以下是创建自定义插件的步骤:2 |2 M* }. b( @; P& M) F2 j- F
; ]& R/ C. ?# r& w! r
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:: s" R+ F' \ B, n9 x
7 c# ]; J. m% q+ \& a7 |
```6 I# @% k- w+ a) i4 L
<?php# Y0 @1 N! n3 p8 ^2 q
/*
5 u% I. f( V* g& A5 v/ k' h2 x, B Plugin Name: Site Wide Notices Plugin, m' Z+ B2 j9 l& {9 U, o
Description: Adds a new custom post type for site-wide notices.
c% [# L: T9 j$ h5 O) e Version: 1.0
I- R! f6 u1 z+ n" E Author: Your Name
' o0 @! E) j7 t6 k Author URI: http://example.com. t8 L) w# H6 A* p, {5 O% R; C, A
*/
1 r6 G3 M, k0 } T4 E. z( l. G+ _; Y3 r7 {0 e
// Add plugin code here..., B0 W9 y0 h. I: U5 D( ^- J9 j
```
" [* r" g5 }) h" N' D5 Z
4 g4 x; l, ] p2 I' m6 d 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。- T1 M- g5 D: x0 `$ b3 Q( @
$ w/ M! G5 r4 e! g3 i
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
. r1 V' L" t7 A, V6 d( f2 O: Z- a2 r2 Z. f
```
7 l% Z8 p, r$ r$ t3 C: H$ [ add_action('init', 'create_custom_post_type');
1 _- m p. M9 V" _* i( o4 V function create_custom_post_type() {
. b: Q* O; ]3 K! [ N( W% _ $labels = array(
! l9 Q' G3 N' a0 Y 'name' => 'Site Wide Notices',/ i# M9 m7 e9 W% R: C5 ^
'singular_name' => 'Site Wide Notice',2 D4 X0 @9 p" [5 V/ i8 h
'add_new' => 'Add New',; {( M6 A! o# A# b
'add_new_item' => 'Add New Site Wide Notice',2 ^$ p3 k/ p- B: \ i
'edit_item' => 'Edit Site Wide Notice',
2 n2 e7 O3 s& B# D 'new_item' => 'New Site Wide Notice',
: u5 A7 d, v8 M9 I! ` 'view_item' => 'View Site Wide Notice',$ M* X$ `4 ]( Y0 s
'search_items' => 'Search Site Wide Notices',: L8 a0 g( D3 x) l0 @) a; y
'not_found' => 'No site-wide notices found',
8 Z& a0 P; d* o o; n" r( m 'not_found_in_trash' => 'No site-wide notices found in trash'
/ W5 e j9 `) m N8 _5 e; J4 I );
3 W# p3 X, T; `: ~) x4 Y- r# `' B0 ^0 a: k; l& V8 L' S1 @
$args = array(8 S% l& t* g% k' h0 J( @5 n
'labels' => $labels,
! Z7 t* u6 b" {% n0 v 'public' => true,% Y% A2 w) g7 { [: [
'has_archive' => true,& S& D% b5 N, U( ~0 T. F) V( T
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),* g% v4 s! }8 Y
'taxonomies' => array('category', 'post_tag'),
0 F5 P4 i3 \% G 'menu_icon' => 'dashicons-megaphone'," A/ V# H: f/ ]" u& h
'menu_position' => 5,- a" b% {* D: ^, h% B
'rewrite' => array('slug' => 'site-wide-notices'): C0 E: [9 a* c; B/ `4 I- }
);
- m6 Q @. g7 ]$ H7 K
- D5 j6 [- s9 `. K0 x! F/ d$ B% C register_post_type('site-wide-notices', $args);
8 ]. ^: }' t4 g$ l; D9 }, g }
) c- a, Q( \4 X" s& V( f ```; |7 |% L2 j0 ?
4 y2 |5 S7 X7 [- Y8 p% @9 J 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
/ s |6 Y2 \* ?; g" C% A4 V; h: n9 F; G" |5 f' B! m. s
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
3 |, k/ M$ s9 j ^5 c# d
" f4 Y" Q1 P. S0 j- \% m7 m3 h; l ```
* m: x4 t, Y7 ^, c: w1 ~ add_action('add_meta_boxes', 'add_site_wide_notices_boxes');9 H( K/ }0 {1 u, d% q; x, E, ^
function add_site_wide_notices_boxes() {2 I% i6 X. C: }3 R' U, `% E9 C5 ?
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');# _6 D) ?9 |! y" _5 S- U; F
}$ y0 y w5 Q- h+ j0 y5 g
0 d( T+ S |$ N, w" r$ M function notice_details_meta_box($post) {
( e1 u, @, ^/ ~, ]6 U wp_nonce_field(basename(__FILE__), 'notices_nonce');
6 E) }" _2 V2 x& X $notice_title = get_post_meta($post->ID, 'notice_title', true);
) k- Z$ z6 n+ r, j! B* z2 |! r $notice_content = get_post_meta($post->ID, 'notice_content', true);3 y0 j1 g. D! ~2 }: w
?>+ i% _7 o, i: o: \
<p>
5 u$ F( h7 c3 [5 s. `% b/ j2 p <label for="notice-title">Notice Title</label><br>
' u5 W3 S: P/ ~/ A <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">5 u1 j* g+ `2 [8 u
</p>
! K1 S7 W8 a$ F8 g2 D1 _ <p>
5 C' K' _4 U; q; y7 P! L <label for="notice-content">Notice Content</label><br>0 c3 J1 z. P {% x" e! k/ U
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
1 P: k7 d) M! R* o </p>
- j8 e( D: d% z5 M2 v, `6 g <?php
! k. A. m1 S& W+ X8 L }+ [3 @0 @( {8 b" u4 |, u0 y
4 u* H7 y% M" C( }% F' N5 F
add_action('save_post', 'save_site_wide_notice_meta_box');
" ?' H. k7 b% M/ C function save_site_wide_notice_meta_box($post_id) {
: V$ Y4 p9 c9 s$ w+ u8 N9 @ if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
3 `3 g% }. u- r3 X return;
* B g3 `) p9 U" v+ R# N& H if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE); O9 P" R" x4 @
return;; t; ^$ [; K% t2 D9 _7 ^( k
4 [1 F+ h5 W5 h
if (isset($_POST['notice_title'])) {
, ] Y$ @0 z7 t6 O* ~7 j update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));+ ^; N: J6 Y( s
}5 [! t5 R/ d- E, Q2 }$ F
if (isset($_POST['notice_content'])) {* h2 f# ~" D2 b8 ?
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));' W; F& l9 M3 X; Y
}4 D: e& _2 F5 X7 @ N
}
1 ~% k; E2 P% @6 Z2 O- n' | G! `8 p ```9 u; X& B: S6 Y
1 _7 I1 C' p; z) o; R
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
7 p% t% B4 Z; v) [" Q- M( ^0 R+ {! x5 g* L" _# r
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:/ S2 S& n$ h7 Q) u+ I
# }6 O0 \" g- A: _9 b ```
9 d4 `; \7 U+ h q% j: x $args = array(
6 `0 |2 c; q \2 N0 T 'post_type' => 'site-wide-notices',
2 G8 S# y+ R. S' b9 g% w 'posts_per_page' => 3,
( `7 l. r: K6 H+ c3 S2 s5 `$ G 'order' => 'DESC',
$ `% J# }2 i0 \' _ 'orderby' => 'date'$ J4 g8 A! n: @
);, H+ U9 @" n8 s& {2 L4 i
$query = new WP_Query($args);
/ L& r2 N4 z7 A( }5 Z. I+ \/ W if ($query->have_posts()) :: F/ Z Z: L' {, ~6 A" v x
while ($query->have_posts()) : $query->the_post(); ?>& G" R* x) {; X/ @% h
<div class="notice">* \2 ~6 _7 e- w1 \
<h3><?php the_title(); ?></h3>
$ Q: p5 x- g, X8 _ <div class="notice-content"><?php the_content(); ?></div>
. v$ Z, X& `: V: P$ d' h( }5 O </div>) i2 D6 w7 `. F1 ^+ E0 I1 _; D
<?php endwhile;# A' m* |6 V( d0 r' o( y
wp_reset_postdata();7 U4 a) U1 O6 v& i) c1 e! O
endif;
. I+ Q: ~6 G# T3 Y ```1 Z7 R/ ?( g2 ]/ n) Y5 l) G/ i
, l# J' C1 {/ j* @( f
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|