|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?5 s1 c6 \, A/ ]8 j) U
" U1 N2 {) L$ ^6 G
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
, J' t4 n) z, G( ~8 k: \
% c' Y! m! o; ^, |" {以下是创建自定义插件的步骤:
. n/ w& O% v6 a, _. \2 \* L
4 W( U/ b. I: C1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:7 k* n3 G, q' p0 N# o8 g
6 v; R+ q6 q9 T' _* A ```
) d; Y6 [9 L# m' ^9 S" H; ^ <?php1 f2 ]; v" n/ ? D5 P
/*- p6 i3 T, o+ B! ~6 P. O, y" ^( K ?4 }
Plugin Name: Site Wide Notices Plugin
/ b- q9 b( x6 ]) c+ r$ F+ H3 ~/ b Description: Adds a new custom post type for site-wide notices.0 h* \; l! u# h# g* F6 N
Version: 1.0, Y) N! \5 B$ o# ~( U' |
Author: Your Name% @+ Z. Y/ X1 {: O7 J- v! \
Author URI: http://example.com$ q& r5 k# b" p' [
*// U5 y: j$ a# w$ W! `7 c7 E( [
2 N: c' K0 x( z: p7 C& X& r' G
// Add plugin code here...
* U7 b/ z% B& p" C1 u ```7 ^0 y3 d G+ W5 z* [" G
5 c6 U$ X( M' U 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。$ K4 i& _% h! w4 N
- g2 U8 h2 U _0 i9 _0 Q# R: e2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
4 e# s4 j% T- F" P, a. ^8 F! o# H5 F# O& Q( k1 T' d
```4 b" X) S# g* ?" b
add_action('init', 'create_custom_post_type');
/ g. t% P! M% b0 J function create_custom_post_type() {
6 g7 l, d- c/ _9 H$ r5 } $labels = array(# Y6 o1 M R# _8 V) A
'name' => 'Site Wide Notices',4 z3 [3 A6 U h3 Y+ b
'singular_name' => 'Site Wide Notice',1 H% w# D5 L+ H: ~" {
'add_new' => 'Add New',: T- e4 P4 b. s1 f
'add_new_item' => 'Add New Site Wide Notice',. [2 C+ o2 e3 _1 `5 x7 G& _+ {7 {9 A
'edit_item' => 'Edit Site Wide Notice',
, i6 g+ k# S2 t0 k ]+ n 'new_item' => 'New Site Wide Notice',5 Q" G. I& L2 z
'view_item' => 'View Site Wide Notice',2 T' @; M) t, w" e
'search_items' => 'Search Site Wide Notices',) N4 x( g/ S" W: |+ T
'not_found' => 'No site-wide notices found',
' [! E: y' @8 Q1 d: b j' g; D 'not_found_in_trash' => 'No site-wide notices found in trash'
$ l" V( g1 g8 h9 `0 G- B! D2 D );7 K. Q5 p' U+ B8 `7 X- \
2 Q7 k3 g3 [1 ?5 C, z9 p $args = array(8 K7 T j7 ~* T: w* e: Z7 ^8 f- @9 X
'labels' => $labels,) D1 g' m9 j$ r+ u
'public' => true,
3 ]: P0 K4 p, \! ?, f 'has_archive' => true,: M5 `. F' c$ C, i
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
8 J& w5 a( x% j6 L( V& Q& I5 c' B 'taxonomies' => array('category', 'post_tag'),
9 _5 g- L: Y M; ]9 r7 Z 'menu_icon' => 'dashicons-megaphone',* h0 Z9 x/ Z- S9 D
'menu_position' => 5,
. N% f. n" G" p4 x; c1 u5 i0 w7 s 'rewrite' => array('slug' => 'site-wide-notices')* Q7 l3 |0 B) W* `/ d
);
: r3 ~( `0 X* R9 X5 ~ t1 i% u! C. q5 k& T
register_post_type('site-wide-notices', $args);
0 H g# I/ P% @7 O: b! i; D4 ~ }
/ c3 S" U# p- R( t' ?" W# T* ] ```
* ]1 v4 J4 h2 w V3 w' b5 e8 b ]' f, B4 _& i" B7 F4 f3 { F& g
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
, K+ V( h" \& M+ X) T! G" _5 h
" [& k& n( `$ W( k& A3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:6 e' t8 L: t5 @& @$ C4 I6 A3 f
9 y0 T3 S/ t9 s2 m ```
% y* t! F9 ~ _. i9 N add_action('add_meta_boxes', 'add_site_wide_notices_boxes');. Y7 H% Z; C! `4 M6 ?9 c1 h
function add_site_wide_notices_boxes() {
/ m& q# w' ^% b! j) @: R# C9 D$ U add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
2 }( r% A3 }( N9 j }
/ M! {! ~6 m0 i5 O! K* i* B9 U3 x; U1 |: U
function notice_details_meta_box($post) {4 r @' r, O& Z) C" q+ u3 f; t
wp_nonce_field(basename(__FILE__), 'notices_nonce');
+ r6 T \7 w# H: V3 \: m $notice_title = get_post_meta($post->ID, 'notice_title', true);
3 r" ^) H, \2 p, }# e, ], E" z $notice_content = get_post_meta($post->ID, 'notice_content', true);
7 F- P m+ d6 O L ?>
6 r) K6 `. u0 h! H <p>
: Y3 W0 N, t# J2 c6 m6 } <label for="notice-title">Notice Title</label><br>4 [8 g+ B8 z* X6 ?; u( S6 b! r
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">$ W- ?: t# k% D% ^6 [" x
</p>
5 @9 ~% x* f) I1 E1 |0 G- M <p>
! ^# Y5 B9 K. W7 B <label for="notice-content">Notice Content</label><br>6 {0 N8 v" ^! t1 V: _8 N+ P
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
8 N" C) n# E( b# e/ S% F* p </p>1 Q; ?5 X1 v' b6 f- r
<?php
) f' G9 e# T0 \/ N8 x }2 g! t$ _7 G$ C& d* t8 {/ L
# {8 N; [. e1 o add_action('save_post', 'save_site_wide_notice_meta_box');# v$ |; i( C) h7 k4 X- P/ J/ K
function save_site_wide_notice_meta_box($post_id) {+ Z9 l; Q8 e8 ]
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
0 h& E4 o% z: t return;$ _: ?" L' u/ z+ j) f- K
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
& [0 S+ [- d* H4 I* ^5 J) X9 s0 ? return;
! S- ?# b& v4 V) O9 [+ C: a2 u4 K
if (isset($_POST['notice_title'])) {# P5 w6 @ M. }8 ]2 f( j
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));& T7 Y6 R" g* G; ?4 u- [
}
- x! k: B1 c f1 Q# \; a D# J& { if (isset($_POST['notice_content'])) {
. _! V" H) i0 @ L update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));8 H" E, i# T0 |
}' X9 v' L0 e: n$ ~+ t
}- C5 [8 \3 X$ m: H L
```
% F/ F: n9 o2 k3 ]7 x
" A* Y; P# z6 L i9 t* @0 ` 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
( f; v; A: j) C2 o/ b
( J2 X! z& ~' N. X4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:7 S- z" ]. l6 }
; Z2 T" E. _+ U& @ ```
2 p" s3 w/ C" }6 j1 w- I m0 u& C) A $args = array(
9 C0 s- X8 r4 x$ H" w9 N7 L/ [2 R 'post_type' => 'site-wide-notices',, W# ]0 }4 }+ e7 j2 t
'posts_per_page' => 3,2 u' W& |" B1 ^' X9 Q2 R0 G
'order' => 'DESC',, U ?! v7 I7 H- i; j& V% b5 o
'orderby' => 'date'
2 M; n% v& O7 E0 k. Q8 h% y );
" C$ I- S9 e+ x2 ^ $query = new WP_Query($args);% V* t, A. L; C. b( Q- M
if ($query->have_posts()) :; R6 Z/ O$ P% g1 z, W3 s
while ($query->have_posts()) : $query->the_post(); ?>
# Z+ y. w1 W, n' s <div class="notice">
& N+ y. ^8 w' V# ~6 c <h3><?php the_title(); ?></h3>8 W+ \! M: E; u9 T" D
<div class="notice-content"><?php the_content(); ?></div>" k. i. M# O" q! M( e. {6 n
</div>! J) n2 T) c) M- f! l# O& i& u
<?php endwhile;
7 t5 X; Q$ h! k# u wp_reset_postdata();: k5 Z7 G6 t" F+ x" q. M! U
endif;
t5 }0 ?/ @: h( J! p ```
' D$ F1 F+ h! y- m/ _# s
& i0 Y' e: t* Z' N/ F 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|