|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?0 T J- D" b" Y1 @: E
9 d2 u" y6 s. T% T$ u3 ~: [3 |' o
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。7 l1 i A" P# ^2 S5 u7 C b
c0 F' c$ Q- w* x. m$ Z8 ^
以下是创建自定义插件的步骤:# O, o/ f% E/ P Q
/ L" e/ T# h5 e& A+ @0 c& n1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
3 j& V. R! z) A. q# V
2 o# d, ?4 V5 C& |7 d8 Q ```6 S u0 Q2 G# X z: R
<?php- \8 E8 Z) ^, _' I
/*% k, K1 ?* G' D* A1 ^5 ^
Plugin Name: Site Wide Notices Plugin
# k( B+ j8 K/ o3 M7 s( I$ o- X Description: Adds a new custom post type for site-wide notices.
2 w2 |; R, w3 w+ b" j Version: 1.07 a. t+ O+ l( ~) c
Author: Your Name
+ m: F i0 g( p6 L. l- c Author URI: http://example.com* G: f. i6 J3 H3 u
*/
$ x' @5 W6 ?8 F5 M0 |5 |. t6 B. B% a- ?5 y
// Add plugin code here...& \% g3 h1 Y) r3 N7 K) ~. _& K
```
/ Q5 t% Z- ~- d5 g% c2 G0 J5 Z- P3 g1 b
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
D8 r- |3 t* U; v! E
& I2 y! y: L t: H q2 R( q2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
I0 O. F2 c) j+ Y
0 a! ^" n |4 ]0 [, V ```( j I, z2 f/ F' x# I% j
add_action('init', 'create_custom_post_type');( T$ T& r4 @9 J" b
function create_custom_post_type() {) O" j9 d- A; b: D/ i4 I4 b7 g
$labels = array(
4 p1 p! Q9 C" O/ V 'name' => 'Site Wide Notices',
5 k7 k+ {6 c, {$ v* x% o 'singular_name' => 'Site Wide Notice',( u& k) x; V9 T1 \/ v
'add_new' => 'Add New',8 B. x! q' u- s9 a
'add_new_item' => 'Add New Site Wide Notice',
; c# K( v. n+ D+ |6 k7 E 'edit_item' => 'Edit Site Wide Notice',8 Y+ L+ k; g5 ]
'new_item' => 'New Site Wide Notice'," @3 K: ]& o- b5 S- x6 Z
'view_item' => 'View Site Wide Notice',% @- O a; ~- b7 U8 H/ j, h
'search_items' => 'Search Site Wide Notices',
& c) I/ D& _ `. D0 m: J, }& Z- m 'not_found' => 'No site-wide notices found',
2 d, D( P# t& o+ O v 'not_found_in_trash' => 'No site-wide notices found in trash'; v) ~/ `* ]6 a) a$ n
);
0 H( C& {- C I9 L) U+ f4 R( Q- b: @* I: J9 L9 H! _6 ^6 i
$args = array(4 |8 y8 p/ l% J% ?% T) u2 m& C, l
'labels' => $labels,
" E e3 @# d# p7 D 'public' => true,* ^! o' \, e5 a; h1 s2 |( d' Z
'has_archive' => true,6 w2 B0 H1 y' o! D
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),0 M& m; H3 i( K A
'taxonomies' => array('category', 'post_tag'),
% G" P- k+ K% }% W+ h3 @ 'menu_icon' => 'dashicons-megaphone',! _& D# s) F3 z1 b5 Q
'menu_position' => 5,
! J( p. @# q$ T 'rewrite' => array('slug' => 'site-wide-notices')
& s$ O; J" q/ z, }6 o" F) _ );, k% D& B9 G2 L g
( s0 K" L# v" P- Q
register_post_type('site-wide-notices', $args);
! K& T9 x, H- O b9 X7 q! C; A' i3 J O }: x+ A ~! r, H+ g( s: R0 L; w
```
( w5 R4 h+ z q. k T$ |: p
7 M% r F1 z1 R/ T/ U* F 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
* s' s" p, f( E6 S, h% M; M# p; _: G3 N! Q
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:( J4 s, B8 z- {! g
/ m' V9 P! V: O& b6 k5 v
```0 C( H9 R- O. ^
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
9 B/ o5 g0 B: E0 h8 b function add_site_wide_notices_boxes() {) o, D' z8 I$ q6 c5 g, ^ ?+ ]7 H
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');4 s y ]$ X, C" n/ j, D1 j
}5 i# e2 z# Q1 {$ D' Z7 h! d! Y
d! [8 B8 k% r" `" q
function notice_details_meta_box($post) {2 q5 h' d2 H9 Z3 Z |+ F
wp_nonce_field(basename(__FILE__), 'notices_nonce');
$ b5 Q& ^. n5 t0 @# r" t7 q $notice_title = get_post_meta($post->ID, 'notice_title', true);
" X5 w' H2 q# { G! H $notice_content = get_post_meta($post->ID, 'notice_content', true);
- {2 W0 |* O& ` ?>
! n& Y0 V) `( i) Q0 I <p>
) l/ c c! W! q5 X5 e <label for="notice-title">Notice Title</label><br>
3 J" K$ S2 P: t" O <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
; q, l; I* ?/ H& d" D* j </p>1 K4 R+ }$ U! _7 Z: o
<p>
# T5 j$ G- @3 A2 ] <label for="notice-content">Notice Content</label><br>/ I. p# k% Q+ z0 D: h7 @8 g+ Y7 s
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>6 v: r, m4 r# e' a: h0 n: b( Q( D
</p>
' z9 | X& k! p8 ^8 Y <?php
! `3 d$ s: l# b4 S7 N) P9 K0 R7 { }
* v% ^) A5 w2 S2 _6 H" o
2 e3 \4 n! L! C' G add_action('save_post', 'save_site_wide_notice_meta_box');
: j! d$ I0 j" Z( ~) u$ _8 d function save_site_wide_notice_meta_box($post_id) {
1 V' k3 W- |3 S7 a if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
4 v9 ]" b% p( l5 x- o& R9 _* Q return;* F! J" W6 e# m' ^
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
' X/ q- n1 }" L$ E return;4 U, ?2 F" L# ]! G/ N
+ }3 K/ a0 F9 t3 P
if (isset($_POST['notice_title'])) {1 Z$ y+ ~# R4 t9 j+ u/ O
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
1 d, b6 T" l7 x- i f# r' r7 y }7 r# _% `6 n/ _2 ^
if (isset($_POST['notice_content'])) {
% [! K' Q3 c3 h R- n! C2 } update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));; H* M9 v5 l0 x5 i6 z. {3 x
}* W7 r' S! Z7 v
}
' p: ? W' h: y# B+ N; a ```
# @ ~; @9 Z3 `% K/ V+ e1 T& y# l' Z+ y$ M
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。* H( l1 L1 s, o% K+ ~/ e
& R+ G. a: G& R6 I/ q8 g
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
* s+ n; }/ D& c; K# l9 F$ P+ h
% E& T; C8 E8 H& N8 y0 d ```
8 j6 Q7 d& x; ^) x+ f" o $args = array(6 q! n# J8 w7 h; F
'post_type' => 'site-wide-notices',2 O9 V8 j8 t* C
'posts_per_page' => 3,% k1 W: G7 v$ v& E
'order' => 'DESC',
: t8 W* Y: z& ^( }4 r1 z 'orderby' => 'date'
& v, U$ I5 m/ X2 D$ _! x2 k );( V# V* D! a A' N
$query = new WP_Query($args);
% o; b7 b/ e& G. C s0 {# c if ($query->have_posts()) :$ B! I! z1 \- y2 G1 U. H
while ($query->have_posts()) : $query->the_post(); ?>3 J. v& x7 K0 Q; n
<div class="notice">
" p9 c& n( T0 e' c3 {/ p7 S <h3><?php the_title(); ?></h3>
7 k3 z4 H0 v' Z# ? <div class="notice-content"><?php the_content(); ?></div>9 K, `# v. L8 L
</div>1 @9 [9 E( ?( A- S
<?php endwhile;6 N. t+ g% P0 k2 K5 w
wp_reset_postdata();
7 z8 w, _1 A' T2 u endif;/ ?" Z1 l$ a5 ~7 g2 {" B7 q4 K
```! a+ y( k$ q" P1 P5 J2 e9 w7 S. J
, p) }3 H+ ^0 A/ `/ Y/ F3 O 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|