|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
5 s, G6 d0 i0 C% W
. A5 L& E2 H5 J+ y( Z' w如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。5 C9 }$ }& f1 |+ B+ k9 p9 Q5 y
, }$ H; e3 M* s以下是创建自定义插件的步骤:) q$ {# b2 O' T* Y
, x9 ~ P1 y8 ]0 K/ n/ v2 J ?
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
, a% J- s% v4 V* D2 Q+ Y; f' C" G. B! \9 Y j
```5 o( I4 E: Q+ t" t( t8 Q! p: a
<?php
# D0 c) M% B" i /*3 E, w% c% f+ {; z) L0 I
Plugin Name: Site Wide Notices Plugin
( b, v! Z0 U$ ~ Description: Adds a new custom post type for site-wide notices.8 l @; b7 ~: W! \
Version: 1.0
: c5 N7 ^; H! l5 `! R Author: Your Name
! X7 z! [6 f P F4 B' W* x Author URI: http://example.com2 R1 n5 m6 s# s/ F+ h1 |8 v
*/
" }5 g$ H, q4 }* X3 [) p2 c4 D f8 I7 m
// Add plugin code here...3 y6 H v$ |! O9 \0 ?& I
```
" p5 A& ?- G) w' a2 D% D
' q8 X4 X8 M3 t% I( [ 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。, Y( t' Q/ Z) n" z5 a4 K! s. P# j
% m# M3 t( z) w; A- g) m2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型: D- z( C5 R+ J( }$ u7 G+ x
- D+ n4 @2 U9 Q/ R% A6 N4 b6 N
```$ ^$ h/ B, R1 |7 D1 [; ^* ?4 a2 s
add_action('init', 'create_custom_post_type');: y4 G% t1 B" A
function create_custom_post_type() {) X4 o' N* C; `9 P( n
$labels = array(# ^9 m4 v3 L% X
'name' => 'Site Wide Notices',
- [/ R# p0 }- f4 E 'singular_name' => 'Site Wide Notice',9 L$ f: ^7 i- x/ P: e
'add_new' => 'Add New',
- F6 H6 E: X g3 h2 n7 | 'add_new_item' => 'Add New Site Wide Notice',' K B( o' G7 K. f
'edit_item' => 'Edit Site Wide Notice',+ u, c/ g8 o! Z. ~. m
'new_item' => 'New Site Wide Notice',% _; `% l5 k% W" U! o7 ^
'view_item' => 'View Site Wide Notice',% u3 j) [! S4 q' }) u8 g0 w
'search_items' => 'Search Site Wide Notices',7 p4 L7 s0 G( x# C* y* T6 V
'not_found' => 'No site-wide notices found',
- u! ]" n& H: v- }+ j; S; p, ^' S 'not_found_in_trash' => 'No site-wide notices found in trash'/ F" ~3 ^6 k6 Z
);
! ~* d0 S- |; w, V7 m% n8 i
7 P/ i1 h" o+ F $args = array(1 r0 x. O% i5 f9 s
'labels' => $labels,+ @! a) }) B: X" S. M6 u) F
'public' => true,) {# ^' ]* v. B) K) e
'has_archive' => true,
) k6 _( B7 {8 T+ b: g 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),8 X+ a: {- S6 ^9 o& y
'taxonomies' => array('category', 'post_tag'),
0 y3 h6 p# M6 I, Y" ~+ r- X 'menu_icon' => 'dashicons-megaphone',4 m% ]' n& i5 H% i1 R. R8 Y2 q
'menu_position' => 5,
; o3 l2 I! U- E/ S 'rewrite' => array('slug' => 'site-wide-notices')
\) U7 E3 c: g" z6 H+ @/ n );
. H' o$ B' Z g
" W( d: P2 T+ m& v# v register_post_type('site-wide-notices', $args);7 E4 l$ X0 A2 s/ i4 I1 X% [6 d
}& E) h" Y6 V1 A' W) B
```
4 ]+ E9 m* D5 c% E$ V" B2 J: Q% R, c) t N. W4 N
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。2 x) }2 T8 H. C, P8 _' Q" N/ y4 n
8 c/ N+ T( G9 t1 [0 }! l. W1 ~3 l3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:4 Z1 o+ ]- w, _- K# ~4 a" i
/ v9 u2 ?6 ]& I, v- _( Y ```" c9 B( t" P1 v3 K
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
6 x2 F0 b1 Q8 W+ s1 |! U function add_site_wide_notices_boxes() {
a- _& m" F. }; B: `0 h add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
+ y$ u; \3 C1 S }
7 c. ^5 v1 A8 }, b7 q3 |2 Q M$ Z0 B' `/ w5 a
function notice_details_meta_box($post) {
+ V( X8 o4 ?4 }8 H* S4 K7 d wp_nonce_field(basename(__FILE__), 'notices_nonce');
) J# o4 _* S8 q5 J, T $notice_title = get_post_meta($post->ID, 'notice_title', true);
& e9 e7 I. {0 H S& l+ j/ ?% e/ R) k6 t $notice_content = get_post_meta($post->ID, 'notice_content', true);
/ ?8 w% |+ C; E9 z' M ?>5 \; s% L: B, | n+ G2 r J
<p>7 O, }. K/ V8 ^# ]/ F
<label for="notice-title">Notice Title</label><br>" G1 ]: A) h5 Y) X
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">4 K7 g) G3 J% Y- T# B
</p>
; F: x+ O$ G2 i <p>* y- l2 Q I! D9 o
<label for="notice-content">Notice Content</label><br>- U9 Y* g( e6 j3 w3 u1 e# N
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>" ?) p. m2 a: Y! }) l {! g o1 ]
</p>
! O6 U$ M- I* G$ H <?php
" V w" Y0 @7 J+ H3 _+ M }. G" \6 t+ [2 [6 G
/ }% T! T! j( z% X" P add_action('save_post', 'save_site_wide_notice_meta_box');
4 s0 X+ i: K2 N+ }0 M( q function save_site_wide_notice_meta_box($post_id) {
: R) `+ S) x0 d1 b' W/ N if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))$ q8 _' X4 Q$ l: r0 \
return;+ u2 o8 l0 Y! m- s0 }
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
+ d* t/ ^' R9 D; e4 J return;7 _8 K6 K8 i: U& `) |3 U9 u
) `7 g7 A! t5 p2 \# \0 o, `8 a
if (isset($_POST['notice_title'])) {
$ C! z/ n% p/ i7 ~ update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) E) ^. E; D# K$ P
}/ ?$ h; D: _ r
if (isset($_POST['notice_content'])) {0 l0 r% x9 y$ D( m6 n
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
( @! G" X1 }- q2 j/ s6 _ }
$ b4 s s9 ^3 G+ T8 r% F }
* f# n! i! W* R; V3 O6 Q ```2 e# [: \) x9 h- F2 o1 k
4 \# l6 S' |" } 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
7 b9 n% K1 @% o
v( Q1 E f8 h% ?# @4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
- L U/ M/ K1 g' Q' B6 b j% h/ e- ?+ E S5 E
```
" O, I5 }3 e; n $args = array(
" U* X) J9 b M- l H7 _/ H7 n6 [ 'post_type' => 'site-wide-notices',5 q! ]+ q3 S3 C+ A: N
'posts_per_page' => 3,7 P# [: a% g* z- U2 B0 X: n# A
'order' => 'DESC',
( l' r0 X8 h& Y: g* a4 W2 M 'orderby' => 'date'
, \& |$ c+ R% m2 U );
8 a5 x+ p; B3 F2 ^: v* k: t8 Q% c $query = new WP_Query($args);
) y3 S3 z( `) l0 }! @+ ] if ($query->have_posts()) :% Y; k: ]) c1 Y" S
while ($query->have_posts()) : $query->the_post(); ?>4 [( y3 [1 }( R
<div class="notice">
; ~7 p) [% G. u. \- j3 ~9 M <h3><?php the_title(); ?></h3>, \9 C1 Y. {+ R0 d( `
<div class="notice-content"><?php the_content(); ?></div>
0 z4 n }" f* z2 E" W$ j d' ]9 U </div>
' O5 X& ?" V6 i/ p <?php endwhile;, R. w* K: m" I
wp_reset_postdata();
8 w( _+ M/ I# x1 Q& W endif;
! A! b x/ V& Q: ~& E ```* `3 H! T- Y$ r* B) d8 V, k! d
- ^ Q0 s/ S! Y4 j: l* E/ c* y+ p 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|