|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?# }$ ?5 U# t$ E V" y+ e0 h, N
- A/ A2 W3 b4 P! h, z4 |7 g如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。2 Z7 j' Q: D+ ?9 ^
8 |/ G6 q2 d7 n. K+ i) t: b/ {8 g以下是创建自定义插件的步骤:) S6 N) Q/ w, K6 v ~
5 |6 _$ ^* _& {( s" U6 H1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
' B- j) j) V+ C% }) H+ N- [: F$ L% P: J5 ~ Z
```
9 F1 [) E# c c+ @ <?php" E; X# q+ ^ G( S. Q
/*# P/ W3 r7 Z/ c, M' h
Plugin Name: Site Wide Notices Plugin3 h0 [- ] a: M
Description: Adds a new custom post type for site-wide notices.
8 }, H- l7 n; L8 } Version: 1.0* j: Q! ?' O3 l$ d; B* f% n
Author: Your Name! q- E/ R' N+ x3 o7 X; y, G! |# D
Author URI: http://example.com- E3 i0 g5 ]$ j2 G# ]1 h
*/0 h9 t! G5 u O5 D% c. X
" O# p. t$ s% Z* Q; F
// Add plugin code here...% r# ]$ @% W6 s. O
```
8 K6 o2 A! Z: t6 h
$ Y4 C/ z& u+ u8 Q$ N# U$ H" j 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。4 h6 C3 z+ n& C. L* F8 h6 ], u' \
5 F( c/ L& ^) f2 g$ q
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
8 m9 D( M, E3 Z9 s+ K! y" I! T* n. N( L. z+ b% O
```
% D k. a! B8 k9 N0 y3 z* Z4 j add_action('init', 'create_custom_post_type');
* b' [0 F/ _7 m' g' j2 l function create_custom_post_type() {- i8 g( _2 }$ ~& w+ N8 M, j/ p
$labels = array(! @, S' j! d0 E4 ]. H$ l4 V; `6 }
'name' => 'Site Wide Notices',
/ _9 n% o# J$ |2 a# u+ Q5 H 'singular_name' => 'Site Wide Notice',; M' v9 ^! i: R9 D& S
'add_new' => 'Add New',2 l% P& ?+ A/ E& r6 {6 z
'add_new_item' => 'Add New Site Wide Notice',
; m: ~! {+ f8 J# h* M+ ? 'edit_item' => 'Edit Site Wide Notice',
- [- W3 a) l' W# Q5 \3 Z 'new_item' => 'New Site Wide Notice',
: M* \, t: @" C" P5 e 'view_item' => 'View Site Wide Notice',
# ?5 p# i( d5 Z5 G+ ~ 'search_items' => 'Search Site Wide Notices',
5 ]) d7 H& c l. y4 C+ m$ E 'not_found' => 'No site-wide notices found',5 C1 N0 y/ c) Z8 ]
'not_found_in_trash' => 'No site-wide notices found in trash', c$ Q& W" R2 }" w0 `
);
1 k$ b* u5 L! a. ?/ y% y9 {
/ E |% P7 x1 ~9 y3 o $args = array(
9 z4 F2 K% ]' ~* X, F3 W! U6 |# n! j 'labels' => $labels,/ f8 k+ `* a; B, E
'public' => true,
: h! y! G" } | N0 y7 i 'has_archive' => true,% _3 Q0 M& e+ |: f
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
& U7 Z3 [5 G; N; J" y( N 'taxonomies' => array('category', 'post_tag'),5 O3 ]! ]& { {# o( a; w
'menu_icon' => 'dashicons-megaphone',' G) |8 ^, S# L
'menu_position' => 5,
% a) y/ Q: ~. y! C! p4 H. k 'rewrite' => array('slug' => 'site-wide-notices'); i; r% I% v* P0 J
);, ]' L( |6 v$ {
# e/ P5 r% x) d A7 @2 j register_post_type('site-wide-notices', $args); }6 u4 F. h3 v% _/ W
}
1 a% {5 f D% k4 |0 I, z, ~ ```5 [; d0 F; n+ K. W7 [
5 L; l+ ?7 f) S$ w+ M
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
& g% @/ X, L, @' _! y& |2 X" J" x- _( v- \9 {6 a
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
7 e& @$ `( g1 w( @8 ^; j4 H& ?3 c
. E# n5 a2 s' O( e9 w: `2 _" T ```
8 V# r" v7 `* R3 c add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
$ A3 G5 }9 N8 o# [# _* K$ \, N3 X7 x function add_site_wide_notices_boxes() {
4 [. K( {; O+ E add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
8 j ~8 o6 `2 t9 f8 t* M1 E }* Q1 I6 m- q( I5 H. }( r/ U
B( w+ ?9 l5 h0 O4 ] function notice_details_meta_box($post) {
# r; _3 _- s$ t% r3 F# \+ y3 X wp_nonce_field(basename(__FILE__), 'notices_nonce');
0 _1 ~" ^ \4 u r/ ^- ~+ Q $notice_title = get_post_meta($post->ID, 'notice_title', true);
2 |/ F4 c" ^! d v S- @ $notice_content = get_post_meta($post->ID, 'notice_content', true);: Y' q" k) b) O* \
?>
( v5 _1 R$ W5 d& `; E& \ <p>; ~- x3 G! ?* c# v5 S; S; s
<label for="notice-title">Notice Title</label><br>- M; O' w9 x* X- p
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
8 V6 p# N$ |3 p- t. L: r4 J( q </p>
7 [6 D7 S" x/ q5 } <p>5 I! `% e! C9 c4 n. `, H
<label for="notice-content">Notice Content</label><br>
. M1 n8 @+ r9 V. v0 g <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
, M9 G/ ?7 }$ o% a. v, W </p>3 n! X5 r3 F) k
<?php
/ X& d# Q8 [3 ?. V, ?5 \ }
+ c6 ]- M. y1 w1 T' l! w- I- n# f2 ~0 g
add_action('save_post', 'save_site_wide_notice_meta_box');5 ]* j2 G- v* }7 @. j/ v4 z# P" k
function save_site_wide_notice_meta_box($post_id) {1 w- S& ~0 O4 ?0 ]+ f, S
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))6 l7 \6 t9 U! E$ b, Z. x! d
return;$ \" }8 ~# K& w& p/ f0 n& G
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)7 M% Q5 R, E* c+ }0 B
return;
4 n" w& L8 L- u# E$ e
& K% q, ~ B, [( Q7 }- e if (isset($_POST['notice_title'])) {0 ?5 }0 q+ ~. H% Q( W
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));5 }( ]! a4 }- g: u
}
- H2 Q p- n+ L+ w: V if (isset($_POST['notice_content'])) {/ C7 L+ U& J- Z4 @1 N
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));2 o# Z( f% I* W o) @! ?# M
}
7 r8 j( h$ O% _$ U) f) R+ j! M8 g }
5 E! Z5 p u+ b; a ```
* e% K2 P; _+ J {8 l
! R4 h+ \) |1 G5 m& t y; m! O1 X 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
0 b& ]; k8 |- [8 F2 S; \3 ~& X, s& Q2 c1 [
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:- H4 m, M+ A; @0 X
; G$ _7 e) ?/ \1 U$ o9 J* q! z
```, ?* C3 u$ Q" y( `8 h
$args = array(" j C0 w4 v9 e1 S# m! H
'post_type' => 'site-wide-notices',2 |' {1 Y D6 _
'posts_per_page' => 3,+ ~/ m4 k& z- x2 ^0 o) a7 h- d/ s
'order' => 'DESC',
4 E0 G, n+ m& A$ ?- c 'orderby' => 'date'
]# {' Y; _+ I0 T& v );
; U8 g* i7 @# E) O( \ $query = new WP_Query($args);5 P6 E2 m) F4 Y. @- ?+ f8 ^
if ($query->have_posts()) :
\3 k7 H( H1 _8 g8 Y0 l while ($query->have_posts()) : $query->the_post(); ?># j3 t7 ^: k( c7 S$ @ K
<div class="notice">1 V4 C3 u* L6 @$ e- G6 E5 [
<h3><?php the_title(); ?></h3>
1 r# b) z) J: P8 f <div class="notice-content"><?php the_content(); ?></div>
8 M4 v H9 V: E) G" e: ]( j3 C } </div>4 j5 d3 q; C) I/ k$ \
<?php endwhile;$ X6 _5 y# P9 {" y# L1 j
wp_reset_postdata();
2 r. D, \: O( b9 Q3 L: g* w5 F0 V endif;( A: ^6 E1 {4 s) u- V/ `
```- g3 n# x5 J2 W6 s. Y
5 a* Z$ \: L+ V9 _6 r# a% @. A 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|