|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?+ D- N! d- `1 |3 _
2 i1 J# J2 @. I+ F" N$ r/ {
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。9 L# y+ J/ s- y/ e9 X( R& L. @2 R$ b: V- M
# |5 E9 T4 N1 J
以下是创建自定义插件的步骤:5 G9 t5 U6 J7 j0 q" {$ \' ?
3 F; e! H. r9 W. t1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
9 Z+ t) f7 V3 P6 r2 E. o s6 S
; e6 T; V( Q8 `6 ~" H ?. Z& `( T5 F ```( B% n' }* E6 {3 g* B5 G, l
<?php- d# u3 K9 U0 U" l
/*
: ^0 p- B+ K& Y, z9 y# W Plugin Name: Site Wide Notices Plugin% @7 ]" C3 n+ X1 ^$ v
Description: Adds a new custom post type for site-wide notices.; F- f1 G2 W4 I5 c, k _, \
Version: 1.0 }; }* ]4 a% {7 S( t0 x
Author: Your Name
8 }6 [+ f) j+ k# W Author URI: http://example.com5 R( Q( D y# l5 ]! c0 h
*/
# x! k8 f) Z0 u* x8 T) S2 j# ~7 }# D8 T \: b1 D" s
// Add plugin code here...
2 R/ e& v" ~+ b* e3 R+ ?+ V/ f ```
8 F- x( @1 Y# |1 A
- I7 d' }4 ]9 S+ P" d4 M 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
& V5 a- _1 @4 g+ y; m, E, j, o- |8 }9 j( F+ N3 D" h+ t
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
. I* K ], ~' e7 G) I2 S, R; ]
. ^; `# q6 o$ I4 A5 w! U4 f3 t ```; S+ g' C: Z) f' w
add_action('init', 'create_custom_post_type');0 P+ H" Z) T# x$ y
function create_custom_post_type() {
+ M, v3 \, N3 p6 F& H7 \5 Y! U $labels = array(
d6 T$ o3 A2 b1 _ 'name' => 'Site Wide Notices',
1 `! z$ E3 ?0 ?8 v! ~. f% s% T. i 'singular_name' => 'Site Wide Notice',( N4 a) [: ~! d# i
'add_new' => 'Add New',8 N- U7 E5 Q! {7 _. H. T- A
'add_new_item' => 'Add New Site Wide Notice', r# k4 q( }2 r
'edit_item' => 'Edit Site Wide Notice',
4 s9 U1 ~; | q1 g9 a5 R8 N 'new_item' => 'New Site Wide Notice',
: n: f7 h% Q7 |& B% D. K( x( I1 v$ h 'view_item' => 'View Site Wide Notice',
/ v) A% r$ r. ~9 T6 U. f" {; E 'search_items' => 'Search Site Wide Notices',& P1 Z- g+ R$ M2 _% D
'not_found' => 'No site-wide notices found',$ {6 P" g Q/ h( e
'not_found_in_trash' => 'No site-wide notices found in trash'& p0 q+ [5 F. h
);: q. w+ O, n$ `( d. ^ i6 i
" a7 F- d" z- y5 | A! i $args = array(
$ J/ p" `& V$ g3 z. x! i9 f7 A 'labels' => $labels," ^; A( m) W7 S7 p' }" h J9 a) L
'public' => true,
) t; b3 _/ w2 g+ h, ~' J1 | 'has_archive' => true,
$ C: d7 C, q P8 H2 L 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
6 s8 G9 V* I! I' D @! A 'taxonomies' => array('category', 'post_tag'),2 x& S) I: V1 {" T' d0 u$ M4 K
'menu_icon' => 'dashicons-megaphone',. ?6 L: z: A3 V" o. H
'menu_position' => 5,1 O' }: Z; L2 Y* Q* |( ~9 I
'rewrite' => array('slug' => 'site-wide-notices') R- I* }: M4 p a4 o& t
);
8 N/ j2 u7 T6 U% S/ p, J
6 H- ?8 x8 V e0 n) p$ g8 a/ L+ W4 T register_post_type('site-wide-notices', $args);
: Y ?4 w$ \3 j }; a t% I6 Z. N! X9 Z/ B) q8 R8 ^
```
* A8 j& Y4 g( M' f; f! Y
) F) k: b$ j0 F. I9 d 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
5 u; g, v; b+ F, A0 o; j3 H4 I* |6 @, w4 b# R" r) t" P
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:2 c! D* B; |' o6 J
H. Q& } T0 W7 R. j5 n$ H+ z
```
# x+ R& ]" Z d2 l1 w( N add_action('add_meta_boxes', 'add_site_wide_notices_boxes');* B" b$ `% X1 u' U/ t$ ^
function add_site_wide_notices_boxes() {; B4 w" e Z! i: |
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
0 ~; n; R9 o$ x" J0 ~ }
4 N/ `+ u4 Z( G/ S* U9 q* i! u! `9 M3 O: G
function notice_details_meta_box($post) {
( Q: t" q4 k1 y/ q wp_nonce_field(basename(__FILE__), 'notices_nonce');
3 N6 z8 K; ^0 t* l; S9 E $notice_title = get_post_meta($post->ID, 'notice_title', true);
* a6 C: P; v$ J/ v" W $notice_content = get_post_meta($post->ID, 'notice_content', true);
* O* L, @% J% a" X2 ~. w* ~% Q ?>
& y; Q X, P, j$ Z0 E* K8 Z! Q <p>
- w+ z: `, f' N1 o0 K& L <label for="notice-title">Notice Title</label><br>* j* P; E' S% C8 \- i/ N4 e8 k7 E
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
7 F! {1 Y" N: i9 p </p>
7 z1 `9 A7 ^7 Q1 d9 a/ h& G <p>
1 H3 i$ a/ T' t5 d5 ] <label for="notice-content">Notice Content</label><br>
7 |( X4 e* Y! r! A6 Z <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
+ h% c, k+ B+ ]' R) b o </p>
9 U$ X# Y. @0 {3 B <?php
) z0 R3 x, U- I; m }
: r% a, c+ A9 u5 l
/ [7 x. r! h9 Q3 l- u5 `& \2 v add_action('save_post', 'save_site_wide_notice_meta_box');& Q; [* n1 R. w6 d
function save_site_wide_notice_meta_box($post_id) {. E3 Z# ~6 k# h8 ~
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
7 u+ k6 w3 h. T, a# L! u, v return;
0 ^( [) D" H/ g$ I1 k7 G if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)0 O9 A/ h d( l$ p5 h
return;
% v; m- W4 a2 k
# | C5 [9 E$ y/ |/ @ if (isset($_POST['notice_title'])) {
" G7 d- i! S6 I+ @3 w2 ?1 e update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
2 _' W) R2 R2 ?1 ]+ s1 k }
0 [' x1 Z( F. m3 Q: d$ I' W if (isset($_POST['notice_content'])) {
, h3 ]8 o* U8 Y6 d update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
1 }9 q- ~" N% x }
1 |( d2 E6 b7 Q g2 _8 k% [7 R }
( O2 ]8 O. a0 ]* h8 k8 X* J j- j0 F ```" m- Z r7 y/ S* }$ g( j' y
: ^8 T0 O6 u. ]/ ?
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
H, r. z6 w0 @7 p. y8 V- P( n- \9 W# C# |7 d
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:, j2 k$ l' f. e( L% Z$ J$ ~
; L9 i4 Z3 X, C; ]6 V
```
* V6 V. n8 f5 I( I7 d/ J $args = array(
& @# e- X* ~! B) W' Z" I- j& t. j9 a 'post_type' => 'site-wide-notices',
$ X- _; ~" v) |5 U' d) H* _ 'posts_per_page' => 3,
: y" n" Y/ v% i. c( h 'order' => 'DESC',: `! e/ W. S" N& B
'orderby' => 'date'/ U! n3 P' l$ u
);! q8 F {6 e8 n& g( R( z4 t7 h% E
$query = new WP_Query($args);
& E! s& `* N! c- q# |! } D' w if ($query->have_posts()) :4 y1 y" I- f, J: f
while ($query->have_posts()) : $query->the_post(); ?>
+ k$ M7 a8 ~) j2 h$ w6 f <div class="notice">; w6 }- }" k0 j+ o
<h3><?php the_title(); ?></h3>
# ]# }" G) g+ o( K <div class="notice-content"><?php the_content(); ?></div>
: E+ y# u" X% @+ \ </div>/ l# t: P# Q2 @- q
<?php endwhile;% s9 C$ x2 ]* A* z# E
wp_reset_postdata();
, U8 k( H/ ]' l) H, z" k% n% W endif;+ ?, Y+ _/ Q- X$ ^/ E
```
- Y$ U7 P, c& i2 X1 x+ H7 e3 L" e3 |: K) F- T8 N5 N
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|