|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
6 u* X8 Z! _! r! @5 \: T) B
6 q; g! ^' S+ n. R如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
0 U% `# ~% M4 W2 c
( G5 A' a& ^3 d7 z" E* M" u5 N以下是创建自定义插件的步骤:" a5 h( d8 T% {8 O' ]
! t% o' P+ E5 j( x4 X( W3 ]% ]1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:% x$ {6 ~/ d4 h7 X" S! |
! a, ]3 M6 Q L- {5 \
```
( y6 q/ g7 d! l/ @ <?php. F) P9 l, R% S
/*3 D% k1 Y7 z# W$ E0 t: f
Plugin Name: Site Wide Notices Plugin
) {* v- u/ j" s6 L Description: Adds a new custom post type for site-wide notices.
9 Z2 c& ?9 U2 c Version: 1.0
: ^6 M# N% W* s U Author: Your Name
6 z; a; L* f' }. M) U Author URI: http://example.com
( T& p8 c) R- j. ]3 v4 Y3 ^9 E' E* x */
7 @* j" |3 P/ t. q: v1 w( ~% c+ |" O9 H3 q7 P
// Add plugin code here...
+ \& e7 o- w$ z4 P& h ```
5 `, }, d7 G, v, e) T- |0 `) f+ \! E3 R6 g- A
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
3 c p+ O C! f e$ }- J' U
" K0 R8 {( ~% @# S9 Q' K2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
) H, [! x% q, V" V! _- Z9 Z) h( B, F6 ^7 k' f3 i7 `# z. n
```
( Z6 F! X! B4 c! [1 U1 _ add_action('init', 'create_custom_post_type');" p' G" F5 N: S$ G& U2 q! M
function create_custom_post_type() {
- K- f5 `+ v$ }7 S; @8 ] $labels = array(3 U# P6 n+ b1 H. j# K
'name' => 'Site Wide Notices',
1 d! \8 M' a! N- Z, `9 a8 Z 'singular_name' => 'Site Wide Notice',7 U+ w) [4 k* _* I! L6 }% Y' q
'add_new' => 'Add New',
, z) B9 ]- y' T& Z 'add_new_item' => 'Add New Site Wide Notice',; N& o4 i. @2 G4 }3 ?7 ]6 N) x
'edit_item' => 'Edit Site Wide Notice',( q/ |/ j2 d1 _3 Z+ J) h3 W9 s
'new_item' => 'New Site Wide Notice',: \) T2 i+ l* o' B+ u9 S1 f
'view_item' => 'View Site Wide Notice',2 L: u; Q" E* j$ I( Y
'search_items' => 'Search Site Wide Notices',
- N2 Q; u+ K% u8 Q* A ] 'not_found' => 'No site-wide notices found',
" p s9 _, o6 P7 D" r 'not_found_in_trash' => 'No site-wide notices found in trash'
# n' ^9 k. ^. o1 S );
. R w8 r0 P% m/ ?& P, L1 l3 K, v8 z8 x; ~% L
$args = array(
. S/ c! Q1 ~* p6 W6 T 'labels' => $labels,, J# @* j4 M* e
'public' => true,
- W7 H% ~- f: o- E& O' V 'has_archive' => true,
# X, X, u' M+ i) {6 w+ [0 O; J. R, I. p 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),2 E z- f5 f, ?( Y
'taxonomies' => array('category', 'post_tag'),9 F% \4 a" }* t8 w& }) }7 s
'menu_icon' => 'dashicons-megaphone',/ J, g$ {4 S9 R2 j5 c" ?6 S
'menu_position' => 5,
/ e" y6 o; |: i+ @- _3 y% A 'rewrite' => array('slug' => 'site-wide-notices')8 A" h7 D e; U u# f
);
2 q7 i* X& C0 t0 m0 O
: a: Q& L0 ~! ]1 J register_post_type('site-wide-notices', $args);* t9 f% u" T1 Q1 t
}
. L4 G! w# B6 E7 [- C9 X ```
: Z9 s/ V' t' X; ?! M% ]+ f8 s* C5 q; |2 t& W3 v. H& w0 m. u6 }; Y
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
9 t' ~" K" v! X' d4 f$ Q$ X6 h( R8 z. F% {8 X
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:! k2 o, l* N9 p( T! T
! ~3 o {, O3 z, _
```
% l6 K9 r* G; j# j4 \5 E3 q add_action('add_meta_boxes', 'add_site_wide_notices_boxes');! L* H- U; h: b! B1 }. @
function add_site_wide_notices_boxes() {
# o8 _4 x+ ?: p0 v S, e add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');" V. j0 c4 b. B& L* Z* |, Y
}
! ^. T2 l2 D( |* N& k
* A: Q$ C- g3 z- u function notice_details_meta_box($post) {
6 q. ^$ }% ?6 N6 S$ O4 R, w5 R wp_nonce_field(basename(__FILE__), 'notices_nonce');9 X4 l8 z" q4 z: @: @
$notice_title = get_post_meta($post->ID, 'notice_title', true);) p% }. Z+ \7 z( X+ m
$notice_content = get_post_meta($post->ID, 'notice_content', true);- O6 A1 ]8 b8 y) v( v1 G
?>9 H1 p8 g! n' o9 @& T) G
<p>
: i! W: W+ d$ { <label for="notice-title">Notice Title</label><br>) I: D* k, i% y: K
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">" f$ `! l) W1 ~
</p>, q/ ]% D+ _/ T6 I; Z& m
<p>6 m& a* e' l7 s$ w9 R
<label for="notice-content">Notice Content</label><br>
J0 Z8 R9 C# P7 l8 S9 K+ p <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
& K6 W; L$ j7 M1 l' o2 @$ y </p>1 N/ o+ S2 Y2 R4 [8 v/ L
<?php8 I9 U' |# y4 w+ L# t( g0 B1 \: |
}+ s% b" s$ }- \
% f- I6 H! Y( q$ O+ l# b add_action('save_post', 'save_site_wide_notice_meta_box');; L$ ?: d- f' |# k; A! v
function save_site_wide_notice_meta_box($post_id) {9 v6 \1 g6 J( w7 a
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
8 L4 M! ~6 c t/ j& T, A return;' b$ _+ Z' Z- K0 Y' V
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
6 R# u6 Q- b: n" q9 f return;
" @& S$ W$ Z6 M& A1 z6 z! M' E, I
7 j* K1 B! S" h2 R) u- K) {2 t. r if (isset($_POST['notice_title'])) {4 J& e' B! V3 K* @
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
" t: L' g/ |* e; i' s }
& h2 F# w U5 A3 L! w6 }. H7 K if (isset($_POST['notice_content'])) {
( x+ T% F0 D/ M) h+ Y' P0 D update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
8 ~, ?& j: c4 E2 Y. j5 S7 l4 m }" U1 W4 Z8 V9 @2 A/ u l9 D
}
# q" {& c' o8 Q' ~+ x ```$ z* O+ E( x( v4 d
# U3 i- n- F; { 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
! B: g l5 ^$ u, P! w* V
# H) U2 [; v# c4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
6 i" n `( l& o" L# i0 G' b1 [! Q. s0 m2 D% g' ^& s" \
```
+ q) x' J+ \; i" D $args = array(
( V: f& d0 x5 Z# D 'post_type' => 'site-wide-notices',
7 p0 z' O& O* i5 v( n4 y 'posts_per_page' => 3,
( D1 h( c' t) C 'order' => 'DESC',3 Q5 N' G' E: e# H! A3 }8 D4 f, q
'orderby' => 'date'
) ?+ }8 o3 S; X! m% Z );4 m/ V" L2 x' L5 T
$query = new WP_Query($args);7 o" }+ G8 a7 L. x/ O4 Z F' ^
if ($query->have_posts()) :
3 T+ s7 s/ j2 w9 X while ($query->have_posts()) : $query->the_post(); ?>& ?5 u9 C+ z* K0 y; U2 _
<div class="notice">% b, s! [8 f; H0 ^4 M
<h3><?php the_title(); ?></h3> I, Q* t, K! T
<div class="notice-content"><?php the_content(); ?></div>
6 u& f6 k$ P; F4 ] </div># \+ v2 J9 E# k' F! u" n. C
<?php endwhile;
5 c+ h4 A# d/ U7 ^' n wp_reset_postdata();
+ c/ M% T% B o4 ?- a/ s3 j3 w endif;! v: S1 N# U/ Z( W' c3 q
```- U, b+ O; _4 p1 F
& h( \+ I' g. X8 M
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|