|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?6 ?# S0 [! n4 t* x" F
$ A+ a8 H; h# m如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。6 P- U0 t( M$ R' n" t. N
2 [6 z; K9 c# p1 k3 w6 S, J6 Z以下是创建自定义插件的步骤:
3 w- O6 d8 }$ | V, q
9 C% M# T8 j7 Z2 X6 k1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:" v* ]9 N& A* Q1 W' g
" k: @( P' K3 S8 Z6 t ```
6 t) Z, z, M) f5 W! z8 |: Y2 V; e. W <?php# b( u# {( I$ B3 n1 n9 E, q- M
/*
- j4 b7 \% C6 _& `% ` Plugin Name: Site Wide Notices Plugin
5 s3 P( c* [, r k Description: Adds a new custom post type for site-wide notices.) R; X* Z0 n0 U3 S: F9 E: B9 K- \
Version: 1.0
, I ~/ d9 S$ m/ w' k; W% [2 `7 _/ z Author: Your Name( [* ?/ x9 I. h" L4 }
Author URI: http://example.com( q( z. O b5 ]4 s7 T
*/
7 Q$ G+ [* R7 N+ \( {1 n2 i( ]7 @8 Z1 n: t0 h9 K3 z% \
// Add plugin code here...
6 j" P' N* V& c; ^* f! G ```
" k/ F$ @6 ^/ D. ?# l9 [6 Y* O+ l
, N7 z3 Z' Q( X3 L. x k! h& Q 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
) F3 C% c/ W* @0 @
/ J; |. u U; W* L$ |4 S2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
/ z, F, z( \ U2 G# Q
0 U/ K4 A$ K8 j1 Y' o ```2 k# f9 D! C K% A3 Y
add_action('init', 'create_custom_post_type');
& \3 D1 i" u4 h9 M0 B, b function create_custom_post_type() {
+ }$ y& ~& V. v. I $labels = array(0 s6 I F9 j8 h2 c
'name' => 'Site Wide Notices',
: L# k3 F; w, k& d 'singular_name' => 'Site Wide Notice',4 @ C, n0 L+ U$ D& ]; b7 ?. @
'add_new' => 'Add New',
% X* C; K& d( B) y: f1 |6 b 'add_new_item' => 'Add New Site Wide Notice',
' b: B- f( E5 T1 Q) O# M3 S: t 'edit_item' => 'Edit Site Wide Notice',
6 D( E; W+ L" [7 f) N% F0 l 'new_item' => 'New Site Wide Notice',
7 l2 F$ B1 Q) K- [( c 'view_item' => 'View Site Wide Notice',) _' J0 w' Q& q N% V: O
'search_items' => 'Search Site Wide Notices',: [1 c& @2 ~" i$ b
'not_found' => 'No site-wide notices found',
+ X7 _% W2 \' D 'not_found_in_trash' => 'No site-wide notices found in trash'
7 U" r, m- _3 ~7 {5 u4 ] );
# {' f" L3 c4 V& f& V* E
( m5 Z. _. u" U9 z0 M$ B, v $args = array(# o' Y+ w! D* T% I$ }
'labels' => $labels,
# ?6 ]7 [8 `* w; m2 M/ } 'public' => true,
9 I& w }) C! P* G; }7 [ 'has_archive' => true,
+ K V& R3 j" s5 ?4 P 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
( f) ?+ _8 a% r; h: G 'taxonomies' => array('category', 'post_tag'),' `& Q5 L( N/ U M- g& _' m6 q
'menu_icon' => 'dashicons-megaphone',. W7 p$ w) v& h4 t/ ]
'menu_position' => 5,% i$ O# y/ `0 T- Q
'rewrite' => array('slug' => 'site-wide-notices')
" K! W9 ~+ U6 v% f );
) J# ?3 R; E% s+ F" d; w/ q( `# o& f+ F8 R& F3 P
register_post_type('site-wide-notices', $args);0 j. ~2 e6 u; H2 b6 ^
}8 W& \. D' F' K$ `3 a: i5 @
```
/ d0 R g- ?+ V8 c% e, p' w$ r" M. R7 E
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。+ Q! c* x. p3 K9 L4 Z7 e
: a$ N- ]9 Y8 |2 m8 ], t
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
# j6 L, D3 `8 ]
" b* K' m. S( a2 v! N8 V ```( J* h6 p) y' c' G
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
1 s& B! |& e) B function add_site_wide_notices_boxes() {- ^' }1 s0 o7 f$ G' U: N: ], N! t
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
) l" _5 V# {) Y9 C }3 X% G% j* e- M x9 _! Y
, Z9 K ~6 U/ q$ K4 j" c8 [+ ^ function notice_details_meta_box($post) {
9 r0 n6 I7 ^. y- b1 G* f wp_nonce_field(basename(__FILE__), 'notices_nonce');
" P N, x" Z5 e6 l4 |7 U9 v: C $notice_title = get_post_meta($post->ID, 'notice_title', true);
0 r5 Q! P1 x' @5 L $notice_content = get_post_meta($post->ID, 'notice_content', true);
3 y6 i/ X! I7 w1 x0 e ?>
* L' ~* f5 [5 [ <p>
| F; b; z& i5 t* s3 r q <label for="notice-title">Notice Title</label><br>
& D+ q1 l+ o/ ^7 Z* \/ `8 g <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
9 F2 P2 c7 x' k* R! i </p>
+ w. S+ w: V1 i' [% v4 H9 g% r1 b$ L <p>
; d) Y. Z, L. S4 ~ <label for="notice-content">Notice Content</label><br>
7 w: B6 K" j% W* X$ ]5 f w) q <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>' z }$ E4 W. o1 W+ ~0 Q% S
</p>9 h' a: ^; V: n v6 W
<?php
2 v1 t+ p. S7 R. c }2 v( @! W# c6 H$ P$ X: ]' Y
* L" b$ C0 T* q. t5 {/ ] add_action('save_post', 'save_site_wide_notice_meta_box');
3 o4 H/ N1 j; o& u* | function save_site_wide_notice_meta_box($post_id) {
& S' s) N1 g1 J! X if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
, o8 ?# ]$ w7 L% c6 y* z( K) v return;
( j$ z" c5 E1 U+ Y3 a: H+ I if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)* x: `! ?/ z, z* `! l6 W* }$ l
return;
8 P. [! Z# l; u* _ p* z% L/ Q3 l& p9 T1 h; e/ ^
if (isset($_POST['notice_title'])) {% w# Q1 ?; z6 G% |' y0 Y+ O
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
* M9 ^3 Z" C- c0 f1 z7 J }0 A. ^# Y1 J6 C' y( `; `% D
if (isset($_POST['notice_content'])) {
/ j9 B2 {0 |. A4 j ?; s& f update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));$ i* v" t2 Y& n3 w J7 D8 }
}
- s9 ^4 ]/ N5 e" y; S }( {' o% F- k" Z# [6 ?
```5 [8 v: Q; n& u" R
. {1 |/ Y: i6 z% J
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。+ U# ^+ S5 f4 z( }$ J; `7 J
5 t% P$ L& a) d- U9 s0 W4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:7 E: Y) {5 E# r
4 l0 C* E7 i- m' }
```; g7 ^5 }5 J. O6 Y6 W, ^: z
$args = array(
( C: I5 Z8 C+ P& s+ L6 A' m7 D 'post_type' => 'site-wide-notices',4 ~$ I' w5 M! G4 r
'posts_per_page' => 3,
' w9 A6 s+ U1 u" \1 J* G% |5 H f 'order' => 'DESC',+ w' u7 Y- G z% Y! T4 ?0 I
'orderby' => 'date'
; i3 y1 P+ Y" V8 u );
, V/ S! X- |: Y' M* g6 Y- C- d $query = new WP_Query($args);
: J* Y) l) i1 O3 X. t if ($query->have_posts()) :* E+ j" O- I: m, \& [5 T0 v" i
while ($query->have_posts()) : $query->the_post(); ?>
" h2 f1 [8 `0 R <div class="notice">
1 }- S; w$ O( p: M6 @6 @7 g N <h3><?php the_title(); ?></h3>
# ?2 S7 W# T4 M* ` <div class="notice-content"><?php the_content(); ?></div>
; ]3 o7 ]8 N- a) i2 w s </div>, I4 j/ l- N' F; y& h9 P9 Q/ H
<?php endwhile;2 i$ L* R3 m) G r& Y7 z
wp_reset_postdata();. @& |+ X) G; P# W! H7 W& g+ m
endif;
- ]! H2 X: Z" j! q ```6 r) J" o/ s8 M. E
4 o4 C& R& R R2 ~8 z' I5 e
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|