|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?4 V8 _7 u# i' {; |& ~. W8 A
( s0 X6 F9 a2 b( `如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
! t( g z u+ }% d. ~/ |2 @. }5 U& G' f2 h
以下是创建自定义插件的步骤:
. H' ?7 C; o, [) a/ p6 |! w. M, S: m# S. `+ I. P
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
4 J( n- B/ t8 H& ]& E' Z0 p2 y. C+ e* z/ [5 |3 i6 m$ v3 c2 I6 `
```3 o( v, Q: i% g
<?php3 D- s/ ~6 `# K6 D6 N D+ N7 W" u% Q h
/*% @" r& \8 Z# v5 a$ l
Plugin Name: Site Wide Notices Plugin
, X7 ^0 C$ t; {! \" S Description: Adds a new custom post type for site-wide notices.6 J9 n/ e7 K3 s8 w( q' V4 `
Version: 1.0
- V+ |6 S2 }9 c1 v; F0 i Author: Your Name: i4 }1 X$ `9 j
Author URI: http://example.com
8 L9 @( n5 ?" H */
4 Y6 u; U2 e: o" C
4 I4 W$ ~" f8 \3 M // Add plugin code here... S" J% ]- A8 b9 P; M' s* h
```
+ n0 Y& z3 ?/ r+ Z( S: B7 ]# Z3 {+ S ^! G
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。! t: f: N9 r- S, _, V
+ U- c; e8 j+ q/ G- K2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
/ h7 {1 n9 |$ {$ O6 v! O L
1 Q% U9 f- d) X$ U- T ```
4 X; A: e; Y, n$ p1 U& E/ B& L7 l- g, d add_action('init', 'create_custom_post_type');/ Z- j* }% S/ r. m
function create_custom_post_type() {4 D3 v$ J* k& J1 \. [& m
$labels = array(
0 B5 o+ C- o& a0 F- `9 u" G& @" b 'name' => 'Site Wide Notices',( x( ]: j M5 N+ F. s
'singular_name' => 'Site Wide Notice',; I. }6 ^3 N4 v9 W* {
'add_new' => 'Add New',
8 R& l6 ?7 i* M$ k( U7 b 'add_new_item' => 'Add New Site Wide Notice',: m% e: V0 T4 D% Z8 u
'edit_item' => 'Edit Site Wide Notice',
h/ `+ i& ] U! d* w% W 'new_item' => 'New Site Wide Notice',
: j) ] W) t* N5 I& }7 D0 [4 d 'view_item' => 'View Site Wide Notice',7 Z# @0 \, N1 t# k c5 A* z. _8 ]
'search_items' => 'Search Site Wide Notices',
& p$ }' x" v3 c! b3 ` 'not_found' => 'No site-wide notices found',& c; p! K: Z& a
'not_found_in_trash' => 'No site-wide notices found in trash'
- s: b9 Z5 J3 r" E1 A; D );4 {9 }( O2 n- \6 n
9 r" @9 {1 }2 O" R s $args = array($ d' {8 q6 `2 @& x4 \: v# Y
'labels' => $labels,) `! `, `4 D2 }" Q4 a1 L* X
'public' => true,* a( W1 B7 U, H+ B9 V
'has_archive' => true,
- ~7 \, S" m) T# q9 s3 j2 _( S, @2 ]) L 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
( T9 w6 i* k' Z* P 'taxonomies' => array('category', 'post_tag'),% k" \' I1 G6 d+ A& J
'menu_icon' => 'dashicons-megaphone',
' t' |5 W% I" `2 n 'menu_position' => 5,, O$ m/ V* R2 [8 M7 Y
'rewrite' => array('slug' => 'site-wide-notices')$ ~+ t& c' c4 F/ A" I8 E
);
. B& P6 _' b# j! u2 A4 ?
: R8 w/ k/ l& i' j2 J register_post_type('site-wide-notices', $args);7 _; J7 w+ d( a- F
}: _; [* D2 U( e, b* K7 P
```5 X" ?! l3 m* U6 ~8 k
2 t; }% Q4 d/ }; ? 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
. E1 M, ^- @" C, c1 b! V I2 ?3 G
! g. u) V# d7 ?1 |- i. }/ A0 I ~3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:' W8 F& ~& F' n
+ ~: ~5 L7 @4 g: I( }3 c! u# e4 D U
```
5 `0 f* A! B2 M% ^7 \ add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
3 \+ \* t" l3 P5 D0 Y function add_site_wide_notices_boxes() {7 s' ?4 Y. r* P4 T
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');: r$ |/ ]) Z: W
}
, Y# f( r) ^9 I) p7 ~
* b+ G( c W2 S7 c Q function notice_details_meta_box($post) {
8 w, m, C6 V9 r& G' A6 X wp_nonce_field(basename(__FILE__), 'notices_nonce');: j% k7 j5 G5 ~ ^5 t$ P. U
$notice_title = get_post_meta($post->ID, 'notice_title', true);( E! O$ Y" s- {! r8 b, ]
$notice_content = get_post_meta($post->ID, 'notice_content', true);
9 S. K j- s# k2 w# N ?>+ N' U( Q8 { j+ m4 p9 G
<p>
; r+ x; ^0 H1 Q* _# `4 J# g! e <label for="notice-title">Notice Title</label><br>
# a' \+ N1 z) u7 v <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
, a9 \) D, x3 X5 W6 e </p>
2 y1 O/ T8 p% F5 W( X8 v; J- |! T <p>
. |! b( A( }+ F0 f4 x) h1 M <label for="notice-content">Notice Content</label><br>6 U7 t5 O! I2 i T9 X
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
! T; [& t1 G7 ~5 Z: _2 i </p>* h6 |6 J. y+ ?# x
<?php
5 H; l3 P# F1 ` } s# i$ j1 \+ c) F7 X. U- D
: r7 h0 P3 X8 X- [0 p- h6 F" I
add_action('save_post', 'save_site_wide_notice_meta_box');- M9 w% [. L6 B# e9 `
function save_site_wide_notice_meta_box($post_id) {
8 Z8 }' X2 x8 g if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))4 k( t! i- r* i- d" z7 n
return;
! e( `# P" `6 b( v z+ _( o M, T if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
) x- u2 v) G6 B' e' B return;4 u7 n3 o; J# _
7 p n6 n& ] \- G9 e( L$ z
if (isset($_POST['notice_title'])) {
$ q; k: _$ I; R9 N/ j6 M. { update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));2 ?% u: f) p3 }( D
}% f4 d; F. e4 O- z& J1 [& U
if (isset($_POST['notice_content'])) {
* t1 C# G' W6 a; e& O+ R+ | update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
* q3 z9 S2 _# Q4 ?* j }$ D+ L/ ?* C+ h' \
}) x: ~' P# W- M. A7 u* ^) i
```
* x4 _5 U5 o; v* e6 u1 j: X$ y/ Q/ H7 r5 Z
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。6 N% ~8 J" }2 w+ _% A
3 j: l- q" E+ d- b M) t4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
/ X; g' }- g7 j5 }! y
* J; E( ]: H. L0 n* h3 P! W ```9 e9 ~ b+ G. S* k& u
$args = array(
6 P& n6 G- Q" \7 j# f 'post_type' => 'site-wide-notices',& m3 S) |# Y1 V, Y% a4 H; @% |
'posts_per_page' => 3,' d1 {) q8 u) R) h% S( Y
'order' => 'DESC',. l4 r" E3 S4 c+ h9 e2 f
'orderby' => 'date'. U" W. r) g+ @) G6 y
);7 H0 l* G. v3 V0 W. t
$query = new WP_Query($args);. L% y& ^. W, ^1 K) [( N& ^
if ($query->have_posts()) :
0 K4 O# e5 C/ k! W* j while ($query->have_posts()) : $query->the_post(); ?>/ K- u# v7 t& w6 h; H% q& Y* Q
<div class="notice">
# M; P- ^: c! Y <h3><?php the_title(); ?></h3>
/ J( a* z2 t5 V$ @ q- q <div class="notice-content"><?php the_content(); ?></div>
+ z( w6 e0 ?8 R </div>* |0 m8 H; i& }" z
<?php endwhile;
8 `$ T" S+ F D+ C wp_reset_postdata();! l& A1 v/ H- I5 N4 `
endif;0 |1 q% I6 [2 Q3 G7 A. t& }* v9 V
```
6 x w9 w* M6 j& ]0 L$ d5 U6 Y! k1 ~# ?0 \
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|