|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
# t" k% c* b7 X2 {/ `6 C( |/ o5 m) M
6 ?4 v4 M$ |5 J9 k! ]+ J如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
6 `- L6 T5 H" R% K2 E! b) K! c9 q9 n8 c9 b, S
以下是创建自定义插件的步骤:
) v8 j# q' d% m& _8 Y, W! Q% d
0 X& V2 D* A6 s, I/ @5 n5 ]1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
' c) r$ w3 X* B; l9 _- ~# @( d) I
) E7 G$ p& w7 q ```7 x3 x; a) ^0 N& P- h" |* Y
<?php
+ `" m8 B& ~7 u) ` /*
* b6 y" q; ^/ j3 d! T Plugin Name: Site Wide Notices Plugin
. [; T3 j/ T9 Z5 } Description: Adds a new custom post type for site-wide notices.
# F2 x* v6 J) H! k: n7 p Version: 1.0
* e" W4 r4 I5 ~/ u+ p& I" d Author: Your Name& U2 i# p3 ?- {0 o
Author URI: http://example.com
( z# C9 C& J0 U! {/ G) X */
; ?4 m" B7 g4 [5 V. D# a7 M% c* A0 U. a* K3 f7 g
// Add plugin code here..., \4 R6 r7 H, d$ f) s; I/ S
```& i" }, O0 Z) k$ B6 B+ n6 Q
$ y# |! ]8 ?" j* x( X
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。5 R4 X% Z) s# m- ?* H# O3 D
1 n( j% _' ?/ @( D! _4 Q' s2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
$ D: O. u/ s6 ?9 l
/ Q: e/ \/ q3 W8 q7 H1 U( Q. s) ~ ```( o( ^6 f! M2 E: t
add_action('init', 'create_custom_post_type');
6 }& _+ P# e, q0 ^) ?, F function create_custom_post_type() {
4 z+ l* \0 @/ y" g% K( g $labels = array(
# u- ?/ j% w# l: I T( P- ? 'name' => 'Site Wide Notices',
4 F O, J" H% R% i" c 'singular_name' => 'Site Wide Notice',1 H6 x) d4 C! C! \& ~, B. D
'add_new' => 'Add New',
' h' j4 U+ X& h7 E4 k# a9 E" G! b 'add_new_item' => 'Add New Site Wide Notice',! U! c% s! ~. Y
'edit_item' => 'Edit Site Wide Notice',2 o& s' N# @8 u$ I( u9 j' b
'new_item' => 'New Site Wide Notice',
6 ?3 {& }, O2 Q. {, c# G( d 'view_item' => 'View Site Wide Notice',
]$ g8 b; m% f& R: V. J 'search_items' => 'Search Site Wide Notices',+ H0 L8 ~8 }# W" M- Z' m* a5 }
'not_found' => 'No site-wide notices found',4 Y* \1 n0 H/ D* r- H" m+ Q5 |, G
'not_found_in_trash' => 'No site-wide notices found in trash'/ Q: n+ v3 c* q1 ]) [
);) |2 M3 Y8 E1 i' i! K6 [
$ m; ^. [& v G. ] {( S $args = array(4 X! O1 X6 `. k" j
'labels' => $labels,( s$ H4 S; ?" d x* d
'public' => true,4 @, C7 M9 s" Z/ e. W
'has_archive' => true,0 r7 e) W0 x: q
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),$ r% |- y# D" u2 w# o
'taxonomies' => array('category', 'post_tag'),
! Z) {& V* ^5 y# |$ Y7 p 'menu_icon' => 'dashicons-megaphone',; g, b: t- L1 o
'menu_position' => 5,* ?* }1 d( K' @7 V& g2 E' e
'rewrite' => array('slug' => 'site-wide-notices')
' \0 S. ~# T6 P4 S' o0 t. P );
; }* k1 Z& U* ~4 j' N# ]
5 z2 x, H7 {& W1 o# q1 @+ w; ] register_post_type('site-wide-notices', $args); M* x, f1 N- v; R% @
}, w& d& ^4 z% `& D( o
```
% A/ k8 ^ U6 u( Y5 n; X" H" t
$ E- ~! z7 v' _+ v4 C( w) M 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
& N1 Z) }; F! N6 n& Z6 ]7 N1 O& \ u0 u3 d* `
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
, x: r, G5 K7 K( ^& }) `; Q1 g$ B5 A% { y+ D8 Z% @
```; a! A ~( I# `+ D
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
. B! P0 N7 _* M function add_site_wide_notices_boxes() {! A6 }" s. W1 h5 G
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');0 q5 s% \; W: P6 k
}: `8 T( @5 K5 q4 A5 Y# a* b
: a+ W5 ]' }- e4 } function notice_details_meta_box($post) {+ V! x# D7 J- R/ x! K/ }3 Z5 q
wp_nonce_field(basename(__FILE__), 'notices_nonce');: q- Z0 o3 m2 [) B2 K
$notice_title = get_post_meta($post->ID, 'notice_title', true);
; F5 C2 J: d; } $notice_content = get_post_meta($post->ID, 'notice_content', true);0 @( U3 }4 j3 s4 {9 v+ p
?>
4 F( M! \3 B1 T$ F; Q <p>
7 y! I6 j* X9 s6 E) D' \ <label for="notice-title">Notice Title</label><br>
& d& ^: T, ^4 ^5 I- s4 @/ v5 u <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">. e J" c, A% e6 Z0 v
</p>' ?- d" @7 {' T7 X1 l- V
<p>) p& ~, j3 L8 m) |* \
<label for="notice-content">Notice Content</label><br>
: `1 }0 N0 L& Q2 h4 b# G/ {# G <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
( u, C" F0 Y. ^4 }& Q, V+ K# M </p>" R+ ?6 Z, D- v# ?. G) i
<?php7 v1 N Q' o A
}/ H/ Z4 D" e, Q* v/ ` u! f
V) n# ]9 f) {: t( g, k! l
add_action('save_post', 'save_site_wide_notice_meta_box');5 l9 y: M n$ R% q- t& L \
function save_site_wide_notice_meta_box($post_id) {
0 p# t" I0 q1 |; f( r% ^9 @; Z9 t if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
% v [5 l9 B }7 R- A0 i return;
. V& @& O% O1 R/ P& T if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)$ S: M+ g x. K* _$ S d: s
return;9 M: `5 {" c; Q7 q& E: b8 d( G4 m8 L* F
9 r9 Y: \# O! b: H. e& @: i
if (isset($_POST['notice_title'])) {
# l2 B+ D; Q) }# M: b: D% L) e; A update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
$ c1 E* o+ V/ w0 D$ a0 \6 C }' l& o1 C8 P+ Y$ t( ^) r
if (isset($_POST['notice_content'])) {
: {6 V3 P* d9 @- [' N update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));5 ^9 V5 J2 y i9 `
}
' s: t9 d7 F2 o! T! K }8 I. A9 u+ A9 {: U. T' q9 n
```
! F h& i/ t5 K; i. N# V1 J& y
6 [& ~) S8 d( C7 L# N2 a1 R) q 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
+ r6 z. \: \* [6 m
( l% ?9 r* J: Q! Z4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
" v9 ^( W+ v8 w' q$ k- k& L$ S4 A! {9 I* d% S- I/ Z8 g* Q# {2 M
```
' S" _8 b8 u: k7 `( Y5 a $args = array($ g' Y1 w8 T' G0 w( I3 T
'post_type' => 'site-wide-notices',4 }6 N" Y6 H) T
'posts_per_page' => 3,, v- o' F: S# p' h" U6 U' j- u
'order' => 'DESC',0 q0 O; l3 X+ L, e" G0 C; G7 b/ O
'orderby' => 'date'
1 r j7 b0 l* R/ E );
- y' F- {% G8 L1 z8 u" m $query = new WP_Query($args);
, E9 n2 `/ `) {( Q if ($query->have_posts()) :
% a' c8 S1 ^) R7 U3 F; l while ($query->have_posts()) : $query->the_post(); ?>
1 _* @' U6 T! R* h <div class="notice">
) j: _/ j9 T& J% R+ d$ A <h3><?php the_title(); ?></h3>: P3 M# ~; c9 j
<div class="notice-content"><?php the_content(); ?></div>4 u; o3 m7 t6 `9 }
</div>2 S& b) X; D' O2 o& U4 }
<?php endwhile;- }9 Y0 O) }: L+ a9 h& F
wp_reset_postdata();! X# ^: Y5 \5 A' \3 D U& h/ z) U
endif;) M& Z+ R6 H9 N2 J
```1 o! k- W6 Q+ ~6 J
* s# T* r7 z, b 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|