|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?" }9 X' s" y# a* P- d
- G, l9 Z0 V$ q S. b
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。) |8 I1 Q9 C6 K$ @; @
1 S- q4 u# p+ [8 Y( d以下是创建自定义插件的步骤:
. K5 U, j2 p, h
* L. [9 O7 s( C4 ?: s d) m. S+ i1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:, S* |1 F% p& X% i. U% m, u S
* q: H( s" ]6 r( L, B; o! y( }! b0 Y
```. @: Z3 G/ }2 G' h! H
<?php
8 d- Y/ w1 y$ A /*
8 R( E' f# O" m( Z Plugin Name: Site Wide Notices Plugin, h% U7 u0 e+ o/ }2 Y- n- x
Description: Adds a new custom post type for site-wide notices.$ z( s6 {1 T G: Q
Version: 1.0+ j( A& d7 |: V, M
Author: Your Name! ? V# Y; D! ~7 a* e5 o
Author URI: http://example.com4 f- e) \4 _' I3 _! ^
*/
) Y; ` ^' y9 t+ V+ }8 G
1 E! v& z+ X2 z& r // Add plugin code here...
, J' Q" E [+ x0 N$ w2 @5 h ```
~8 Q! }, j0 @! R7 B
' h/ p$ Q9 o+ B+ P0 M& V 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。& C+ F! Z' h9 p( k5 w
3 `/ d }: E9 B' W( R0 z2 A
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
# o0 I* b4 G( {+ o( a" n% C i% m
2 S) _) H# x3 N# i5 F ```
. e0 x$ s3 M: A add_action('init', 'create_custom_post_type');, X. ^6 W1 R- n0 t3 N" F; J) {5 P
function create_custom_post_type() {
M, z3 k& e, q0 d2 i# U& Y, ~ $labels = array(! Q9 `4 r5 Z% m4 L8 F( V
'name' => 'Site Wide Notices',
* f6 [) d, [9 {) Q 'singular_name' => 'Site Wide Notice',
4 D! k* ?6 h' F" r5 e! G/ ~) \ 'add_new' => 'Add New',3 t3 s* x4 d c7 D, @6 I
'add_new_item' => 'Add New Site Wide Notice'," K) l% [, v* e0 @/ \
'edit_item' => 'Edit Site Wide Notice',
' s4 o" y) A: i& _" y 'new_item' => 'New Site Wide Notice',
2 E) k4 |0 s- ]7 W T7 I2 S& s 'view_item' => 'View Site Wide Notice',/ z8 m" { i$ }1 Q- N& s% N
'search_items' => 'Search Site Wide Notices',( {- Q1 P- j9 ~* `4 y& n
'not_found' => 'No site-wide notices found',
4 H. C" |* p" X; [5 p1 A# J 'not_found_in_trash' => 'No site-wide notices found in trash'
; P/ i4 e( T! ?7 S$ p );( g7 l$ O z( A* ~2 l l
% }/ k( s; ?& S, d4 r$ b
$args = array(
4 Q2 x% V/ R5 O- }( z. O' ~' x 'labels' => $labels,7 e" B$ u `1 }3 a% i
'public' => true,2 R& k4 H7 c2 W: g% _4 g
'has_archive' => true,
0 U- C8 d; d/ ~ 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),& }* `5 K t( K* x9 q0 W0 |/ ?3 ~0 {
'taxonomies' => array('category', 'post_tag'),
) B4 g+ f9 Z5 \# h7 d3 x 'menu_icon' => 'dashicons-megaphone',5 v7 z0 b2 Q0 M( z. }3 G
'menu_position' => 5,( t" \/ h0 l% \1 { |6 m, k3 L F
'rewrite' => array('slug' => 'site-wide-notices')
: V! s$ W E+ a: R6 n );! H z. f( r: N5 v1 o8 t) L+ f
, w6 }1 e& w: u" m( U" Z
register_post_type('site-wide-notices', $args);, M" L7 W: Z0 m8 X; U
}9 Y- S, F$ x. E- _% \. n; Y) L
```6 ^; u& W, k$ k+ b0 ^- c' V" @
* j" h1 \5 U' Y0 C/ | 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。 }8 u& P6 J+ \5 P+ g6 E3 A) P5 u
! Q0 a e4 ]) E6 n0 v* u
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:5 O, M" ]1 y( D# j4 J O
w+ r& p: p: [9 ^9 v0 F9 G
```+ c/ l$ J& t9 e& Q# {! V, X! P7 Y
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');) {6 \ _* N+ k) I# t
function add_site_wide_notices_boxes() {( g# z! z: ?! Z1 Y- X& E T8 T
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
+ B. I# I7 y6 u9 v }+ G3 O }' A( }! M" ~4 g2 n8 P! q; m
4 k! ~: k' w9 w
function notice_details_meta_box($post) {
# F" O$ y- W. X9 W wp_nonce_field(basename(__FILE__), 'notices_nonce');3 F: f# x2 ~1 y7 b6 W0 |
$notice_title = get_post_meta($post->ID, 'notice_title', true);
" o: z0 ^* Y+ L $notice_content = get_post_meta($post->ID, 'notice_content', true);4 n) j# l) E5 ]7 J4 X7 ^$ R1 p2 t
?>9 X- J* k5 e$ c2 d0 o8 J
<p>/ B: \# @; A2 X# j: w3 j, @7 R8 ^+ U
<label for="notice-title">Notice Title</label><br>
m4 ^; D; W8 E7 q: p <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">; j! n- `3 S6 {* F
</p>, Z/ H- y2 T$ A" {" X
<p>
7 V" k& T% N4 k8 V <label for="notice-content">Notice Content</label><br>- q, E3 U: R8 L' ~ k5 Q9 ?0 \3 x
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
+ x: {% t( h5 M1 m </p>
1 B' u: ^: W4 p" { <?php
9 t/ N; L# u9 A d& l" ]; I }
; P; e1 x# E b4 g$ h- b" K0 i- `5 S4 o" v: F$ H# |
add_action('save_post', 'save_site_wide_notice_meta_box'); D8 ?( g4 ^4 y& n* `
function save_site_wide_notice_meta_box($post_id) {6 P) v( [6 j8 B" C
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
8 c5 F5 ^4 k0 G6 E return;) z8 L, `2 F3 V4 {# ?
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)4 }6 b( P- c! p+ X) `0 o( O0 E/ J
return;
+ R- x) \/ ]# ^* t, k# E }5 }: C! X
if (isset($_POST['notice_title'])) {5 @7 V- A2 b$ W$ h- k
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));- x* t- n5 U9 b
}
4 o) d, S& q* X3 K) w) G1 u _ if (isset($_POST['notice_content'])) {- K! [" ?7 ^) V6 Q) Z- u4 Q
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
5 g( `/ U5 ]% L7 ~1 a9 _ }
7 t' e. d" r; R5 h }4 c1 p( x9 s ]' A" {
```
O3 a M2 K# w5 d; _, Z6 V
/ F, G, o! ?; L, H y+ O 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。 s$ t' A# y: U
) e8 e2 W$ c2 ~) X9 w3 k4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
+ {' i x: O7 i1 T+ o1 ]2 k" }. c/ p% n
```% q* ?" ^6 o. k* {
$args = array(+ p& o3 N4 E! X# {
'post_type' => 'site-wide-notices',
^& ?. W5 w2 v# O, t' O 'posts_per_page' => 3,
1 ^ |( d: u4 R9 X8 E 'order' => 'DESC',
0 O9 s- ]( k8 v5 Y 'orderby' => 'date'1 @. W$ o; R p/ j8 O! V$ T/ U
);
( g' o8 H' C2 B- l% L1 m# l $query = new WP_Query($args);
, Y; f" F& ~, I; {. |/ I if ($query->have_posts()) :/ @9 D/ { o& ]- Y% q
while ($query->have_posts()) : $query->the_post(); ?>. P) W6 [, K z) P* a/ r6 q
<div class="notice">
& Y& ~5 t6 N2 d3 H <h3><?php the_title(); ?></h3> k1 [' t- y# b t& f: P! b5 s2 V
<div class="notice-content"><?php the_content(); ?></div>) K! {) @8 E* H$ @5 c% x3 {8 N
</div>
# ]& \; d0 ^; }/ @ <?php endwhile;* |& S! c. P9 I9 O$ D
wp_reset_postdata();$ z( O+ I t0 b9 X X& o y
endif;; T0 `/ o) s" P* R- t
```* B$ R2 `0 w# D( c* t9 t
8 e' B, i s' Z1 E+ g9 h- v" f
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|