|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?( k) D9 d( x. e" e
& m* j0 t5 {8 [2 L, A' i8 Q1 `# a如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。! I) Y# f. \) W4 L
% W1 C! v0 h5 N6 E9 T+ q以下是创建自定义插件的步骤:5 _0 T; e; c6 `0 i1 p
8 `, C& p* `& }! k% A3 r1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
, w5 R6 E! E2 i( S [7 D1 @) m1 I! |2 f9 T) H- e7 D+ B+ t
```
( Y: A# L) t( `5 O <?php- e( e* F! r/ n! {! P0 a* ^
/*3 }9 r, J$ L6 I% e, Q b
Plugin Name: Site Wide Notices Plugin: Z& S+ o$ }% `3 _4 u
Description: Adds a new custom post type for site-wide notices.
! C6 Y( U9 b" F) h9 k% [& V1 V0 z" r Version: 1.0
4 x& X: P3 n, Z. v$ h Author: Your Name
3 B- l1 O# C% w) }) \) b Author URI: http://example.com
I' ^" s" j0 X9 [ */7 i% [- F. q+ _0 M1 p- s6 N
- {! P1 N# w& W! z' d) O9 Z
// Add plugin code here...
8 O/ a' p5 @" [& Y& N; v0 ` ```# H4 W( u/ f+ G
' U/ P3 @( g% m6 M 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
( e( L4 H8 }7 ]' B/ i" v
, b( r8 B- e/ r0 c) ~( k% x* E3 l2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
1 v7 _$ p9 Y. D/ E3 B! g9 `
8 @7 N6 @- b$ ]4 @ ```; m2 F% ^- |2 h' f$ W( E9 C
add_action('init', 'create_custom_post_type');
# f$ F# P- m, m4 o function create_custom_post_type() {
1 [ y. Y4 g& S: ~1 f7 u# z $labels = array(
( \: Q7 Q" P2 x$ E 'name' => 'Site Wide Notices',2 W- {9 ^1 J/ S) v% a7 }* @; [
'singular_name' => 'Site Wide Notice',, j A) X. C% G! ?8 W4 s* |& O) P
'add_new' => 'Add New',
, u3 N: j# k5 }/ a2 m- c7 y 'add_new_item' => 'Add New Site Wide Notice',3 A& f. J9 y, `' \
'edit_item' => 'Edit Site Wide Notice',# F2 s8 D5 ]* _7 A' w
'new_item' => 'New Site Wide Notice',
+ |7 [; d. d% Y: j 'view_item' => 'View Site Wide Notice',
" s1 r4 k2 r, T4 W1 M 'search_items' => 'Search Site Wide Notices', W2 z1 h3 Y' D
'not_found' => 'No site-wide notices found',# b0 e3 h* M- p. {& \; G+ ^
'not_found_in_trash' => 'No site-wide notices found in trash'' q j& u5 J9 ?! ~9 y3 d
);3 E% r/ u' T3 ^3 | K" o. p
* N* u% z. X( J) X+ _! \. h/ @ $args = array(1 D: C4 b) I; T& V
'labels' => $labels,6 @* {/ M6 ^6 r" }- o
'public' => true,
7 S/ [/ x+ u4 u# i0 A; Z: k: I 'has_archive' => true,
0 w: f5 ~# L. Q9 G/ t: `3 n$ R# G4 G6 U 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
' q# h4 P/ e; \/ R$ z7 ^ 'taxonomies' => array('category', 'post_tag'),
! ]; V2 p2 a. \; [' M 'menu_icon' => 'dashicons-megaphone',, F% N$ S4 Y( a5 h8 @/ z
'menu_position' => 5,
+ p7 n& o3 I. d/ j) s. K1 E 'rewrite' => array('slug' => 'site-wide-notices')
2 _& ^/ M- ?/ z0 d );, O% }8 a6 ?0 z
t* ]4 v+ U0 x% W
register_post_type('site-wide-notices', $args);
2 ^& N% ^4 M0 o8 r S2 m }
* J' l* M( `/ A: o7 h ```
2 k8 I9 K! s7 s7 g5 T1 L j
* \7 q9 R$ a" c 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。: F. a. u8 i" J
4 g- i d% l |1 y; m& y5 _3 ~) x3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
l. D" Z. B" f+ t
$ A9 d5 U( `" _# X3 F ```$ T" u' T2 A G- e8 L6 w' y( K
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');- M+ r2 k0 {' |* m8 X, M
function add_site_wide_notices_boxes() {
% R6 i& X# e) B z add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
E: j4 F& a1 c }
- w8 i+ B1 v2 U/ [1 b7 D4 k {0 t" h8 M$ K5 V0 ?
function notice_details_meta_box($post) {, P/ g. @8 q2 ?( a
wp_nonce_field(basename(__FILE__), 'notices_nonce'); O: X. t7 q. R5 Z& `" f4 r) |
$notice_title = get_post_meta($post->ID, 'notice_title', true);
& n) o3 l- P& q' F4 t* } $notice_content = get_post_meta($post->ID, 'notice_content', true);
9 D5 l, j Y& N( i+ e& @" i; d ?>+ l9 r2 S# N- j' o+ U0 _! g5 J. @+ R
<p>% S2 l$ \- z; {4 w) {
<label for="notice-title">Notice Title</label><br>0 ]# F+ G% K6 d R* E% m6 q
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">% ]: G% t$ @( Y* F
</p>
5 M7 \1 B" ?1 p7 f, b5 o. @ <p>
2 I5 I7 d5 B3 `8 }- e5 Q <label for="notice-content">Notice Content</label><br>
* O6 D4 y; c# }( m5 p H4 h <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>& R2 j _. u4 J T4 }# l# n
</p>
! h: V1 I- i: `2 g: [8 H <?php
, b: n& _' H; b0 U6 c }$ e+ G- P1 o7 m J/ @6 M/ c, a$ [/ ?" B
! P0 ~- K' `* I8 c7 a4 {4 t
add_action('save_post', 'save_site_wide_notice_meta_box');
3 Q( ]9 m( X$ w4 E/ H' _. e' J$ i function save_site_wide_notice_meta_box($post_id) {
7 t$ T5 V; @9 t2 Q- ~' y. c if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))9 B$ j6 G" @2 ~* s& {: ^! Z6 u4 ?
return;
- m5 A4 e' q0 i* l8 C2 Q if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
I8 g1 G' I4 P: O$ Y3 X return;
; O# f: N+ K* F5 B
: u3 K" v) u L/ ] if (isset($_POST['notice_title'])) {
9 \$ E! x$ Q E3 M- L6 } update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));6 r. b; i5 C! L2 G3 |/ i/ a
}
; j9 @. J2 ]$ ~# y! x# n) b% Z$ R if (isset($_POST['notice_content'])) {
3 P# v1 c* x0 L5 n1 o3 x) v; I update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
8 w4 G( C0 b5 X& ~: B: X6 u$ E }1 p/ v6 D% n' j3 C. c8 v
}
; C3 U. d4 ^* w/ t+ u ```
. F4 r. p4 r4 Y2 x
! P9 ]1 @6 e1 J- _6 x4 F- H 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。0 H& b$ k2 S5 H) \
' S3 Q- j p7 |# x4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:/ `: \. d* |. L: v
6 s9 j0 F2 M2 _ e* G( S ```
* g* P; M* D5 ^) D4 l- x, z $args = array(
2 C* J# ^$ P, G+ M# q 'post_type' => 'site-wide-notices',
) X% B+ M8 g, ]) [9 u* x 'posts_per_page' => 3,# E& a0 i3 o; T p! c a
'order' => 'DESC',( a: l, @- F( j% A' L
'orderby' => 'date'* {" z) K9 \$ m2 c* e$ B# }
);6 H; r% l. I& R J. A5 m
$query = new WP_Query($args);
' l; Z0 J: r% s2 b# z if ($query->have_posts()) :
/ Q7 v8 w( y3 ]6 J4 g) ~0 W while ($query->have_posts()) : $query->the_post(); ?>& r0 t: r9 c" M+ R
<div class="notice">& z* u- L# p7 v2 G7 H) p
<h3><?php the_title(); ?></h3>: `; u9 W; Q; M' X0 ^3 X+ Z
<div class="notice-content"><?php the_content(); ?></div>& o' d) j& j; _. a4 Z5 y% n/ I$ G
</div>* z6 A9 ~3 T6 h8 B# z4 Q
<?php endwhile;8 T" g3 h; a$ ~; }
wp_reset_postdata();
, ?9 _& w- q8 z! `9 \5 ^! G A endif;
. n" ?2 w5 @$ H- p ```
6 S" o4 L9 G" f! d
% f6 ?$ E1 ~# `! `5 l; Z! L; L4 f 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|