|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?* n& \9 E% n+ @2 k# L5 {
& F' @+ w' k7 v( V4 a3 i
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。- h) F( I, ~! `$ A- Q
; e1 f3 X5 @, u
以下是创建自定义插件的步骤:% H) A6 e9 y u1 h6 W
9 ~1 @. J- ?. h+ h/ S/ C1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
* ]. J$ S# v+ t8 P( I
0 R" N# t1 v" s, P: S* h6 W. y ```
/ t% O$ r1 x( ~ <?php1 p/ ?1 \* k1 ~# O& ~# ^2 n$ u
/*' v6 w6 N* D- @$ Q: `% F, M4 M4 Q
Plugin Name: Site Wide Notices Plugin
7 w, I J" W" L3 u. X Description: Adds a new custom post type for site-wide notices.
- n( q7 Z% j- `5 C Version: 1.08 F4 x" s- s1 L7 h) V9 R$ Z
Author: Your Name
~4 q1 F M6 f: A$ Y* R Author URI: http://example.com. d" R2 y3 a7 D$ J* K* ^
*/
1 Z8 v4 }) ~+ H! s, j* ?1 H- M
/ x. A% s$ C! _' S! p // Add plugin code here...9 u/ `4 H2 B1 b# j7 \# u& J
```
5 c. {6 M/ i) G8 Y6 j& G. u9 v, [) X! u# }0 I; @& d
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
. y/ i6 F% e, |0 r& J, P: e( p' s1 w5 N
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
' C- ]* a) x3 p: l6 o% R2 v1 D$ r8 e
( r5 G, a1 d$ m3 _. ^ ```7 C" d% l" i6 B- G
add_action('init', 'create_custom_post_type');% k: x ^$ `1 c1 F0 q9 t
function create_custom_post_type() {
/ y7 l+ n, F4 F# v( p0 _) w $labels = array(
$ x9 d* J9 v6 p& E% _6 g5 J 'name' => 'Site Wide Notices',
. x3 ^+ J2 ]8 D/ ?( @& n& q 'singular_name' => 'Site Wide Notice',$ H" @7 m8 N& {+ c$ X8 N ]/ f
'add_new' => 'Add New',
, ^( Q9 h* w) u! H1 y 'add_new_item' => 'Add New Site Wide Notice',: z+ f6 s) r, }2 u7 U4 F
'edit_item' => 'Edit Site Wide Notice',3 B" D, L3 W8 `+ v0 \( V9 Y# U8 s
'new_item' => 'New Site Wide Notice',
1 M3 T7 C9 X# J1 ~# B( q, M 'view_item' => 'View Site Wide Notice',
8 e3 ?* Y# ^6 O6 O 'search_items' => 'Search Site Wide Notices',# | X8 k& T$ [& T- B8 b( n1 ]& Q7 k
'not_found' => 'No site-wide notices found',
, z' q1 J2 K4 X& C- o S 'not_found_in_trash' => 'No site-wide notices found in trash'& z9 h1 f2 o0 d! u- H3 N
);% M2 A! O4 P+ \/ A7 k1 F
) e3 T2 P# N! k; |9 C
$args = array(
9 v, U+ G. f) H- N 'labels' => $labels,
- {$ A. F( |+ R" `) y% | 'public' => true,
: w6 ?' H# c3 ] F7 ] 'has_archive' => true,
- K" W2 ^+ z6 s, v8 k" Z6 X 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),2 l" ]" J- V3 |6 V' [0 C
'taxonomies' => array('category', 'post_tag'),
8 K0 H B* Z( c& p2 H+ _ 'menu_icon' => 'dashicons-megaphone',0 T7 F4 H( h; Z) Z& t- X
'menu_position' => 5,( q: V+ v6 B) Y. \ ?
'rewrite' => array('slug' => 'site-wide-notices')
/ P6 M5 N. \, |; G# H2 e) S );
1 o5 c6 \7 Z* Y; N* g: M* R
$ A, k% N4 ` v register_post_type('site-wide-notices', $args);& |6 g6 y3 {& W* C6 ^
}1 A. Q# r( Z1 J3 \+ J# H
```
2 W: F* _9 E+ z3 V/ H) k* t9 ?; p6 {3 F# D0 W
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
% o3 N- X. c- u# b C
3 Q$ I% s2 Y/ c4 c* u0 X4 ^+ l2 e3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:- W7 @- f/ _9 v0 \+ T1 u
! C5 b+ m% I2 m# P
```
I( j! D% k8 |& B7 W add_action('add_meta_boxes', 'add_site_wide_notices_boxes');4 ~8 m. ~+ g# z' v% C, A" P6 o
function add_site_wide_notices_boxes() {
2 G* {" i$ E0 U% G add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');, k: ]: d, O+ u
}# y9 o& @& R2 T
. W# J- Z2 D! m
function notice_details_meta_box($post) {6 j( o: j) W! C) `8 q
wp_nonce_field(basename(__FILE__), 'notices_nonce');1 q0 m1 a1 Q+ y
$notice_title = get_post_meta($post->ID, 'notice_title', true);
$ h) V N! [) P $notice_content = get_post_meta($post->ID, 'notice_content', true);
9 V* A* R$ r' }" O6 u% U1 J ?>
) G6 V9 Q+ {) G2 F0 { <p>. ^0 u9 B' n$ v) p) m& c- w' ~
<label for="notice-title">Notice Title</label><br>: o3 B0 n; \" H8 k) A
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
2 f+ ]0 l. r! x </p>
, I o! y" L9 o1 ~$ d! _ <p>
0 n: Z' O6 K2 D, M+ l <label for="notice-content">Notice Content</label><br>; z8 x7 y( N7 v: f5 N/ V7 s
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>) \# I9 N: l1 b: x
</p>
& M# D4 [" q" a# r <?php
% s9 l) J" ?6 I9 J! z }6 W% q9 }8 P* h! O$ @
b/ J" F& [& I5 q1 O _
add_action('save_post', 'save_site_wide_notice_meta_box');8 y; ]% E) _5 |& F! d6 U
function save_site_wide_notice_meta_box($post_id) {
# O5 K1 V2 H8 ~$ d, a if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))7 ^0 s+ i4 R" G. Z6 y
return;1 R, L \/ ~, [6 k9 B% `, T* o
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
) U. Q# S6 z( i& u return;0 ^9 i, d0 \& }" a
+ u- w7 _ \% O) s5 }: q" T
if (isset($_POST['notice_title'])) {
; C# i& Q9 {6 ~& y update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
" g0 m, W" m; z5 r) M' P8 Z }
4 d1 G4 B* `' X& w i( A1 {2 o1 [ if (isset($_POST['notice_content'])) {
, C3 X- c, ~/ r& z update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
5 I- Z& ]6 F3 r }$ G+ g+ n9 v% V3 s# |: w, z" U/ `
}
6 \0 o% m/ U7 r2 g. | ```
0 Z, M: a/ d& Q5 c
( ?& M4 N, K) \3 P% {2 a/ ?) B 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
1 ?, N- {! p% l i1 A) P1 ~
7 s+ }. Y* g( O3 T4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:# U# G- I5 M3 T2 k- i" r
7 y3 q) ?; j! E
```3 ?' Q6 ?2 E" _# E! r6 w
$args = array(
, [3 C ], K' e7 r 'post_type' => 'site-wide-notices',
5 c/ k& n$ i9 Z+ P; S! I' g. g. F 'posts_per_page' => 3,
0 I7 e; _) r( r; P. q 'order' => 'DESC',7 Y% }3 ?, }- u' \' f; W& `
'orderby' => 'date'( i/ G, l" A9 U4 G
);- F, w, q8 s" C& s2 l' H' e
$query = new WP_Query($args);
( [/ U8 l8 L, k3 E1 J if ($query->have_posts()) :
# k1 Z( j+ K: t7 {7 P while ($query->have_posts()) : $query->the_post(); ?>
& q- ] @) V3 j6 U <div class="notice">
1 c; F) I* c( l5 ^ <h3><?php the_title(); ?></h3>
5 e5 G# @, k" C/ L <div class="notice-content"><?php the_content(); ?></div> o; U6 {( B7 l, \ j/ q8 m
</div>
- h0 H$ w5 S, S <?php endwhile;
9 v j9 q1 i8 q, ]2 E+ c wp_reset_postdata();
& B1 {! c7 ?" i% {' ~' S2 q endif;1 W G9 q" E$ M
```
, V2 m2 x# r+ G3 ]: f6 W$ }' f- @8 }8 l$ Y
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|