|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?( a/ P$ ^; i" O a6 W
, n' u$ m! \& c
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。8 c0 x3 J0 G5 e4 V0 b( u& ~
3 \% I4 Q% a; c H& |1 ?
以下是创建自定义插件的步骤:
8 _4 |$ V* j& M7 {
" p4 Y6 l" ], |. {) g* o1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
8 ^+ P" K. J0 f6 ]. D" c Z1 `% \3 L! ]+ Q, ~) j" a; S
```
: K% `9 O: ?6 N1 _ <?php
$ d8 B# ]6 [7 U' r, h% ^ /*
6 ?& z0 G3 x5 [0 q, Q Plugin Name: Site Wide Notices Plugin
9 K c* Q# w$ P1 d& P1 ?0 v Description: Adds a new custom post type for site-wide notices.+ }8 R) a$ ~) D# a& Q
Version: 1.0
4 i2 P1 k) y. q+ K$ b$ S8 n" ]+ k Author: Your Name! R- k3 u o: [" c( v
Author URI: http://example.com5 S5 A# F+ c/ l; A- I
*/
( T6 q$ d0 e- E9 \# q2 T* ]. |1 r$ D3 C, i
// Add plugin code here...
+ P; j. t! T( @$ ?5 } ```
* W% W8 [# K& N8 t
1 D2 W; q% F4 b' T* t2 o& p 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。4 {) D9 m8 o8 t' r7 u- z
7 a/ b! T0 z) s ]8 p1 q3 w
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
1 t) v* Z! Y" F/ {, B V( L8 h% V% l5 z. Z
```
- Y& q3 K2 x6 a add_action('init', 'create_custom_post_type');
L) b6 L9 {) v9 n9 ^% y function create_custom_post_type() {( Q/ s6 F- K9 v. n6 m
$labels = array(+ e e9 J* v1 i( r8 ^/ D- b0 p8 F; C
'name' => 'Site Wide Notices',+ ?! ]6 }7 v1 j1 r& U( Z
'singular_name' => 'Site Wide Notice',
- Z, e1 M9 |1 ~2 x7 U4 K8 | 'add_new' => 'Add New',
' e* p1 T8 [0 R 'add_new_item' => 'Add New Site Wide Notice',
& L, ]0 S0 q# z0 {5 y! f/ J7 t 'edit_item' => 'Edit Site Wide Notice',% B) M4 }' Z" _2 ?0 r" a5 D
'new_item' => 'New Site Wide Notice',' A, N# i9 K+ B7 P! R
'view_item' => 'View Site Wide Notice',, F" h. }0 d. [
'search_items' => 'Search Site Wide Notices',: o3 S# A/ \! {1 X! U, U
'not_found' => 'No site-wide notices found',, d: @& U. _+ K2 o& c. G
'not_found_in_trash' => 'No site-wide notices found in trash'; w4 m, N- Q' D8 R; P( {& Q. R( u8 J
);. D8 d8 g. N y& ?! O1 p% @( X: C2 q
# N- s+ \& C3 R/ e X $args = array(, V8 l# _% R8 m1 R1 p( q7 l; i
'labels' => $labels,
2 e' b9 e0 |2 o0 r. H' a 'public' => true,
' j2 w/ i/ \& N, h2 j 'has_archive' => true,
- [3 g8 w6 w8 B. u 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
% g1 H( ]) I' q# C) g; w. H3 ~4 M. U 'taxonomies' => array('category', 'post_tag'),$ y( D, G! {8 N4 ~. J' _' i
'menu_icon' => 'dashicons-megaphone',
3 P& m; T+ Q1 z6 Y 'menu_position' => 5,
" e* j- K3 W7 G7 y, P0 A 'rewrite' => array('slug' => 'site-wide-notices')% i! t6 b' j* A( j
);
6 H {. \* g# ?- y7 c) I$ G; P
register_post_type('site-wide-notices', $args);
C+ @" X( I) Q" o9 V }2 _) j7 H- g. t$ U
```
5 w9 x9 r3 v1 m3 r2 L3 T& r# n' R4 T0 |& @& F8 n; {: _
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。6 t) P7 s8 F8 H0 _
* b) q B- `$ ^2 @
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:/ A3 z" w" c3 c& {7 z: w3 Z
3 F3 Z! A4 T1 C) R2 C& e
```
0 J; r, c5 q H, R add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
& ~2 i/ P) C. W8 F function add_site_wide_notices_boxes() {
& u' d% B# ]8 [8 a* B& I! J7 o add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');4 }$ \. i/ S6 B2 h
}- ~. |$ g8 F) C7 h# D8 Z4 R
( K( O, Y) z4 ^6 `( k0 x9 c9 f( L
function notice_details_meta_box($post) {, Q& O- u5 c/ i1 b+ N e
wp_nonce_field(basename(__FILE__), 'notices_nonce');
; O9 t& [% W& r5 a5 g8 R: @ $notice_title = get_post_meta($post->ID, 'notice_title', true); h+ H1 u: F; c1 t. j6 H) \
$notice_content = get_post_meta($post->ID, 'notice_content', true);. K% W. ~2 Y# S& U) i w# Y: |. \
?>1 f* j+ Y/ V7 T( B$ @5 [- |+ @# L
<p>. k3 h Y: o3 n: Y) T% T
<label for="notice-title">Notice Title</label><br>
2 t- g( B& j( k: f* Z" k <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
; m, G" l; k7 s2 M& X </p>
/ C9 l0 c+ A3 O# C0 `7 m, i& a5 i <p>
# t" L( ^' @$ D <label for="notice-content">Notice Content</label><br>' ?% _/ z; l: Y) Y2 B
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
$ F) D( v; v! J B </p>; o& V2 u, W* m( N/ I7 F
<?php0 G1 _% c' z+ S: v# k& h/ d+ w; [
}
8 B2 p$ ~2 o- h+ J8 p! {4 n9 i/ ?5 f6 W9 x. R
add_action('save_post', 'save_site_wide_notice_meta_box');
% K7 j5 @" y2 j( z$ }: _- S function save_site_wide_notice_meta_box($post_id) {
& v7 `( O: C5 c3 F if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
. ]# q m ~% r" m! B( b5 L4 C return;* G- `, ?; S2 g' u
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
% ~6 O" [8 I" k$ l" x8 e- E3 k+ H return;4 e1 d/ T3 M6 j7 {
5 j l/ x0 H( R1 L1 [ if (isset($_POST['notice_title'])) {; u5 }3 a! d" s3 g8 }* ^1 X
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
9 u; u0 T0 ]) \- y* M6 a+ x9 T } j: {8 g4 o# |+ v- F' r6 g$ ?0 _7 y
if (isset($_POST['notice_content'])) {
( q) B1 _* f9 F& j: T update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
( d. a5 p1 n# X }' c b5 F( R6 A+ O; X" M( c
}& x1 a$ z( g* c" f; {% `
```
& ?$ T+ t6 l5 G4 d+ [2 a5 l1 v! B% Z
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。& ]8 ]) {; d: I! `9 A9 Q1 N
, t( l9 B, n/ t- |8 L
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
+ F8 i$ X+ Y6 e# |1 N# b3 W5 g1 S. U
+ \ s% a3 q, f, L- p% s ```
( D5 I- \' j9 o5 J+ q $args = array(2 ?7 C2 E5 L+ W6 m# Y: `7 [+ o/ }
'post_type' => 'site-wide-notices',8 a* w+ e/ A0 T6 l
'posts_per_page' => 3,
C0 r+ o, o; K* [) | 'order' => 'DESC',
0 A( a# j/ ]/ a$ B+ F# n9 P 'orderby' => 'date' @& t. P) O# d6 `& P$ s5 \2 u1 E
);" Y u7 [8 ?* H E! @. k* C( v
$query = new WP_Query($args);& c: P+ |, V K" m2 b9 |
if ($query->have_posts()) :
* i4 d# T$ w, M8 B) O5 [' Q while ($query->have_posts()) : $query->the_post(); ?>
) G$ o# {9 B% r' D/ h <div class="notice">9 V- w0 V2 n: A, d; ?
<h3><?php the_title(); ?></h3>( B* G; l' P. C: M& Z: z& O
<div class="notice-content"><?php the_content(); ?></div>
& s) L! R+ u( }; ], C% p' j/ Z B </div>$ N' F; a) @- i# d7 c. N) k8 z: x
<?php endwhile;( N/ F5 m4 u: w" ~, q8 Z, ?
wp_reset_postdata();
2 B" y0 \7 z& c) `' Y. ` t8 S endif;4 h6 n3 E- L- E
```# M2 `2 e: S+ c+ U/ V4 e4 _
' Z) N4 b3 ~8 h0 l4 q0 R% A 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|