|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
5 |% z; ~+ X- n1 ~9 X. X' {/ u! g( K M; d, x$ i( F) V
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
$ j- g8 A# z' a: K8 x6 \ k5 g0 \* ?+ v! Q; F1 d! X7 Y: n, `
以下是创建自定义插件的步骤:0 i9 d/ p' T: d! j1 \2 b1 ~" J
5 r. ~4 a( k# h4 {$ [9 Z
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:8 L" G, ?, c+ ~) {/ ?
2 h [& o, O' N8 S6 J8 T
```/ p4 {' F6 U& V. l8 N
<?php- Y8 D' Y" J* N3 A3 {/ E( |
/*
; I1 x' P6 j( R2 {/ Y" S) [ Plugin Name: Site Wide Notices Plugin1 T" u ^# c$ H1 Z# _9 j0 Y$ k
Description: Adds a new custom post type for site-wide notices.
/ v! ?$ ?0 r# \3 O% w: e: r Version: 1.0
" J' V$ l+ K( z7 R* \7 J Author: Your Name
9 F' c- c: t9 a* { |9 `3 _3 g7 z Author URI: http://example.com
% W1 M$ {3 T, n: {) _( R: e */
$ g; ]9 x6 Z8 b2 `% h
; [" V4 B$ Q9 C" h k // Add plugin code here...% e- V* @" f4 _. r5 s
```
: d& B% N! U% A! {8 R6 \, I# I% S& z6 ~! ~: ]
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。2 I# z! a: i( X/ p
& R# E5 t5 N1 ?/ i+ |# T U2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:+ q- K8 w Q [2 i N
) e, w( u' s6 _+ n ```
, a- n$ M: f$ i+ w; @2 P add_action('init', 'create_custom_post_type');' J/ D+ @3 {+ W! `7 u" Y w
function create_custom_post_type() {
3 d) c3 Q; c! K- K $labels = array(
( s1 d- b# u$ n4 g 'name' => 'Site Wide Notices',
+ N0 g( X6 \" f" `4 o% P X 'singular_name' => 'Site Wide Notice',
$ j% ^, N$ t/ u- n 'add_new' => 'Add New',' Q4 R3 {& P0 l$ z. k' [
'add_new_item' => 'Add New Site Wide Notice',
( b" |, _8 D" @9 w5 n. \. Y 'edit_item' => 'Edit Site Wide Notice',( e* F5 e, G$ q3 v8 t |
'new_item' => 'New Site Wide Notice',' a. X/ R5 D" E. U5 @" b
'view_item' => 'View Site Wide Notice', S! K/ F, I( A+ f1 U
'search_items' => 'Search Site Wide Notices',; ]" t% k6 F; q: d% I D
'not_found' => 'No site-wide notices found',- N" c& C3 n- w
'not_found_in_trash' => 'No site-wide notices found in trash'7 H0 w# G- N8 d0 h3 K
);
% G A7 \3 j' X. x. c4 q
- c. `8 {7 O7 F: `9 d $args = array(
/ w) j1 a+ e1 p0 W 'labels' => $labels,
; g- D/ f* |: T/ x2 p 'public' => true,
: h' N9 t" M9 u% U- |' s1 A 'has_archive' => true,$ m! ~* Y4 I+ F: `- \: p8 s
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),5 Q* C; m( B5 R3 B7 X" s7 j8 q9 W
'taxonomies' => array('category', 'post_tag'),3 d/ c7 [* \3 l& V0 H7 p, |
'menu_icon' => 'dashicons-megaphone',
. I$ M4 Q2 T7 _4 j5 l 'menu_position' => 5,
6 ` p3 M1 Y, l( P0 v* Y/ \) L# k 'rewrite' => array('slug' => 'site-wide-notices')
- |6 N1 Z& l$ t );; K7 f9 m( V: R5 J
+ u$ I8 e" \' c, A$ n/ X0 } register_post_type('site-wide-notices', $args);
; F& w& J0 q& ? }
) a6 F" s, @- d* }# K$ v7 l ```
) o. J! F+ v# o- e; O" s; H5 {! i! R1 I$ Y% |2 E4 e
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。6 G% W7 A* W5 T1 {# m& a8 S5 X
3 q9 e/ a+ b5 c
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
4 ^" V& _& ]' q2 `* B! ]1 v8 }7 C0 n% w I: Q V" o: J
```
0 B$ S6 q( e3 G+ N add_action('add_meta_boxes', 'add_site_wide_notices_boxes');. {& ]. [7 y# ~8 x
function add_site_wide_notices_boxes() {
1 `0 P# u4 D" q6 E add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');( i4 x3 T9 e7 O5 p) ]' m
}
# ]/ I6 b- A/ n8 Y5 }0 S4 p l$ K' I# \
function notice_details_meta_box($post) {
- K! a/ e% M& Q4 Z% J wp_nonce_field(basename(__FILE__), 'notices_nonce');
$ O4 e5 |3 p+ z $notice_title = get_post_meta($post->ID, 'notice_title', true);! L4 i2 G% n! F- j5 {7 _8 R
$notice_content = get_post_meta($post->ID, 'notice_content', true);1 m: [& G9 C3 A$ G# y
?>" n/ y# _. E: F& G v
<p>5 ?/ R0 g1 F' o1 O6 H: g
<label for="notice-title">Notice Title</label><br>
3 b- X h( }) h. v) v( _ G: a <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">' J, s& f: T. {( ?8 x/ Y9 f# ]
</p>9 j) C8 d- b: W+ ^6 B0 V0 a H- R; {
<p># R( l) }' |( O& n
<label for="notice-content">Notice Content</label><br>
; T9 [% t" W# N: v <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
! B% m! d% U5 I- T) l0 e$ l </p>
( b, F' p/ ?$ {# h <?php
6 o8 e! V: {( T6 E }
5 T0 O# r V( U6 M5 I2 y$ ]+ p4 A9 V3 B1 S
add_action('save_post', 'save_site_wide_notice_meta_box');
3 q2 I6 @! ?& H; ^/ v2 T% \ function save_site_wide_notice_meta_box($post_id) {
4 B' s! T& z5 ^+ h if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
1 e9 B9 o, L8 r: l) u, e6 B0 { return;: x! m; y, h' p: ?) y
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)* H T, Y9 N$ [2 v T# X, |' \$ L+ `
return;& r f' k7 T9 N7 ]! i
4 F& n+ w0 |; `" `9 Q" s" e! T7 \
if (isset($_POST['notice_title'])) {' }2 K6 w0 y8 a& [& _3 l' k
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));. [/ Q0 I# s# F
}9 ^& ~/ U2 u4 C/ [* z; S
if (isset($_POST['notice_content'])) {
! n% ?- M. E M& n) Y1 O- n update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));0 z3 N( H1 J5 ?/ K
}" ]8 i0 q) E$ C6 a/ H' `6 X. t! M; Z
}
' R' |/ [! u3 Y' i4 P' O ```
! r9 t0 ~+ x" p7 x! n' s3 a* y6 v s* L1 `4 A
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
2 ]7 {$ D& ^4 w3 y% r
8 S1 ~# S6 M n j1 G- T7 L4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
3 @/ m( T- e' _% c
- \+ R6 V% T* i, B4 }- {8 \ ```$ y: g, ?& l% N. D* B
$args = array(
6 Y; ^2 k3 e; ~5 j. i7 { 'post_type' => 'site-wide-notices',
8 X+ x2 {9 x0 Q) D 'posts_per_page' => 3,+ q% h2 S. y8 {: x( v
'order' => 'DESC',3 ?: k- c2 _- O/ c ^$ O: N
'orderby' => 'date'/ l( {9 ?* x6 i3 X; I# F! z$ m* B6 d
);" s e& H$ R. |1 w
$query = new WP_Query($args);9 } E% `; _" {2 K# S) E
if ($query->have_posts()) :
1 u5 M' i5 b9 _( P0 i, h8 \ while ($query->have_posts()) : $query->the_post(); ?>: z5 r- h6 B% x7 ?
<div class="notice">
# R6 d( J9 U/ R# _/ z6 }/ F <h3><?php the_title(); ?></h3>
: {- W) e4 G& G" C <div class="notice-content"><?php the_content(); ?></div>
) E- p6 s+ C4 p </div>
1 F% i' @( }0 X2 K" E2 q8 J$ Z <?php endwhile;8 W/ ?5 T$ ?# C( Z
wp_reset_postdata();5 g; j1 \% O' e; }7 v5 \2 H
endif;
5 o k1 k: R2 ?' U' k" J% F ```' J1 p5 X6 `4 Q. ]
; M* N6 C ?% |2 P* n( I" A
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|