|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
G7 d3 ?- O; i
: N7 R) _3 o5 b5 h如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
5 U- n$ V! E5 N+ w& Z: R/ j$ D# \4 l2 T6 r/ r& _
以下是创建自定义插件的步骤:* b8 J, n' T, j
7 |* u4 k( t" _( c1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
( h% h1 _' h: R* P% |9 k2 o2 D3 t1 Z& n/ e
```; j6 y5 @- y% {! I% Z
<?php/ D2 Q+ w7 u; r: |0 Z: n, _
/*1 X0 ^$ B9 `6 t2 ^$ }$ M5 Z# Y" _
Plugin Name: Site Wide Notices Plugin3 C" b' T* n* e, M6 g( w! x) S
Description: Adds a new custom post type for site-wide notices.
# i9 n" W) s' w1 k- O% k Version: 1.0
2 a3 L" k- |( ]0 X3 |/ e3 m Author: Your Name
8 F* g- t6 n# D Author URI: http://example.com a0 l; o3 O f
*/
# u, N) E. S% K+ ?& y( Z. F
( |" _/ z+ r4 F6 Z' ]2 I" Y3 O; Z // Add plugin code here...( e6 I5 k3 `' I2 V1 c
```, H7 v7 k8 C6 y; x3 R/ G" q
# h6 J6 _8 ]5 P8 [4 G 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。; k! G* p _% I$ W+ [) H
2 S6 a2 j- I9 t8 P, m6 F+ W
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
" U8 G# Y1 T* [3 i* P3 s% N9 T) u* g4 ~ \
```
7 e M$ Y" B, d: P8 O add_action('init', 'create_custom_post_type');
- T" M" V0 ~( a; i d function create_custom_post_type() {
0 B7 ]8 q" O. n7 I7 z $labels = array(+ P2 \+ `/ ]+ D; a0 [2 S
'name' => 'Site Wide Notices',
9 o% }; H8 d2 A 'singular_name' => 'Site Wide Notice',: A( Y0 q& d5 A
'add_new' => 'Add New',
8 q( u7 A, X' K; }7 j$ W 'add_new_item' => 'Add New Site Wide Notice',
% Y. M8 B* y5 @5 |! M' E6 i 'edit_item' => 'Edit Site Wide Notice',, R! j# P1 ^/ n& r& m, Y
'new_item' => 'New Site Wide Notice',
* X/ @# y& f3 ~* F8 E4 j 'view_item' => 'View Site Wide Notice',8 N0 W4 g7 c c$ D, i% q
'search_items' => 'Search Site Wide Notices',
! @8 A0 D$ c# w! C 'not_found' => 'No site-wide notices found',
: ^6 s" Q2 [" o* l; o& D" k 'not_found_in_trash' => 'No site-wide notices found in trash'
, p5 E. @; C" Y3 u* M3 W) O+ { );
( q- N# {+ p! d9 {$ z% _: S3 T+ {4 C- c
$args = array(
1 \; s2 M" A" ]' `% [) U: P! ^6 \/ E& g 'labels' => $labels,. E% w- j9 p% K: n" Z: q
'public' => true,
1 \. U8 B. Y# } 'has_archive' => true,* K9 z9 B; \ F, ~6 m6 e! N
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'), n* _" d0 u4 a
'taxonomies' => array('category', 'post_tag'),
; [* t7 ^( E, D' K0 T! V; q 'menu_icon' => 'dashicons-megaphone', ~" f, M/ q) [1 _: ^3 G: v
'menu_position' => 5,6 G5 g( F2 g+ ^, O3 p$ H
'rewrite' => array('slug' => 'site-wide-notices')
- b! h# c- G8 y# K );0 I4 `3 }: N3 @( |; b# U
T( r9 E4 q' Q9 z4 g! C1 [5 b. `. L
register_post_type('site-wide-notices', $args);3 W8 W$ y$ p$ C, b c
}; O, @- {- a R# o- v
```
3 T7 j$ v+ s% K; F! V, s% J) V& V7 u. |# i# a w8 [
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
& U z5 r4 M5 J, l) R5 [! }% {9 n" f7 ]
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:" V8 a1 i2 U& A; c. i2 ]; T! S. W2 |
2 b# l/ k5 g, E2 P ```9 ?2 H, d& ]5 F$ K8 E: Q
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
) E9 d; }1 K1 G0 p* f5 S function add_site_wide_notices_boxes() { J; S# D. W! F) B9 S0 w3 j0 |: Y. @& Z
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');6 |2 u- p0 H& N I0 r
}
: r* e& v8 Q6 R% K) M# |0 v
; ?! Y9 i R! z function notice_details_meta_box($post) {) i8 h3 ~- s* a1 `; a
wp_nonce_field(basename(__FILE__), 'notices_nonce');
2 W9 u* d- I& j* C $notice_title = get_post_meta($post->ID, 'notice_title', true);) ^: I* |* c, R7 i& Q: z, l; B h' p
$notice_content = get_post_meta($post->ID, 'notice_content', true);
) {$ m! i3 }9 G& z; ?1 m ?>
! f g, o! H* ~2 M! T J <p>
0 i' D# ~3 g: r8 F8 O <label for="notice-title">Notice Title</label><br>3 z9 d0 c* {6 C! l9 P& r
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">; _* J& U$ N5 ]- |) y' L$ p1 N
</p>
9 J7 P+ h! P( [. S' } <p>- v2 \) `& U% x' P6 l5 h0 @% y
<label for="notice-content">Notice Content</label><br>
. H9 I% n5 {( Y+ g6 q <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>3 O, K5 F) T6 h, S
</p>- V }8 N& w! F3 ]
<?php$ v b8 a8 A$ F! ~: r C
}7 u/ r0 K7 n @+ Q' {& Y
4 M8 _8 G7 F% u3 U- {$ P3 y+ U
add_action('save_post', 'save_site_wide_notice_meta_box');7 y" t! A' m0 t- b9 U% U1 c, @0 n
function save_site_wide_notice_meta_box($post_id) {+ J: k/ m$ K% l5 _9 c& j0 h
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))), m8 H+ l" Q. e; a8 x; ~* y; R d
return;
' [, I7 s# S# s. s, H* B0 F if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)3 O( i i4 C8 O/ U4 i5 \# ^- {& n5 B
return;; U( u8 Z6 ]0 f4 A
0 Z B2 Y" ]% o; x }
if (isset($_POST['notice_title'])) {
7 \$ {- ^! Y6 p0 |& v2 g# E. Y# n update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) T7 W6 ?" c& z2 X/ l" D
}
2 F8 D2 u7 i3 l! |# H+ a! m if (isset($_POST['notice_content'])) {
# c6 W( e7 e3 r* s; C update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));8 W5 q, Z$ Z7 M+ b3 M" s
}
- }: J& [/ b: W }
' j' O0 j' r" l1 `: C& } ```
' P T, x/ G2 O* c/ D) Z! t& T# F" n& V6 b0 W
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
7 J" o' O+ s! u% `& `' [6 j. S Y- b; ^
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:8 z3 B( f. o2 e$ X
" R8 j3 Y8 b6 A* k2 R ```
J/ V' o7 y' U' J s! K $args = array(
" d. R) b2 R0 r/ f5 M 'post_type' => 'site-wide-notices',
7 L" g; W. W; H2 \+ K# B; i' ` 'posts_per_page' => 3,$ a e4 y6 G$ `7 w6 e8 b3 o
'order' => 'DESC',/ u& ]; ]/ _ ]
'orderby' => 'date'
! w( e8 Z# J a) i );0 C/ O3 A# G( j: D! p
$query = new WP_Query($args);. N3 t B( W+ d4 g" |
if ($query->have_posts()) :. J& d8 V5 W" R0 j
while ($query->have_posts()) : $query->the_post(); ?>
' i/ N8 ^- e" L' L2 y <div class="notice">
* E' J4 }9 U' v a& j6 f+ i$ l* T' N& w <h3><?php the_title(); ?></h3>" c/ ^& r* b8 `2 E6 I, P0 ] \+ t
<div class="notice-content"><?php the_content(); ?></div>
4 \$ ]+ x: \4 H7 E </div>
+ S- H3 p- H9 [ w3 c' L <?php endwhile;+ C6 D) H6 E, m) F
wp_reset_postdata();
( W/ S" l7 ?) ]3 N endif;- i0 R" D$ x2 q$ B$ e
```3 P$ P- D' ~2 z3 H: j: L) u0 ^6 t* t
9 T" Y4 y% X. b1 B, |1 K3 R% ? b4 r
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|