|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
% Y2 U& O' a% `" V+ B3 Q$ U8 i
3 G: d% E& q" C" y7 L8 [" C6 k如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
8 g% ~/ u% a! ?0 H& }2 c- a) l8 g! A$ [( p' H
以下是创建自定义插件的步骤:% J! N0 ~( |+ |
& C& [" _& `% ~- Q/ ]1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
3 p3 D2 C3 @# [0 e! x s' k; x8 C: I9 n @2 L6 I- `
```4 O! U0 i( n3 f. p
<?php6 G/ L( j' u: ~/ |) [7 A
/*
; s6 V! e" @# n) p Plugin Name: Site Wide Notices Plugin
9 d8 S2 [" k- b2 z E* { Description: Adds a new custom post type for site-wide notices.
- ?9 U' K* T5 L Version: 1.0
( ~; V0 o# M, B% w1 j! X Author: Your Name! ?! {& _$ l+ e: K) D( }3 B
Author URI: http://example.com. l/ a3 U6 n! C, ]
*/
0 K# K8 C3 n6 Z4 \- I
0 M$ q' h& a0 N& `( }0 C // Add plugin code here...
, p. n4 b' n" @# d% \% B7 C ```6 ^& V8 c* h% g# @0 l5 g5 q
5 I+ J6 ^/ N& ~- z& T 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。2 M1 T" x( Q" U c3 ?5 H
: n+ I- C& i6 [- B2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
; l6 u; x2 m* q: ?9 A$ ^$ D8 R/ O$ y/ X/ f8 Z
```- N6 P* z/ }9 P5 B
add_action('init', 'create_custom_post_type');
0 I D! k: T, \4 m' c0 x function create_custom_post_type() {
' d: a: e$ x- i+ j9 \ $labels = array(1 [: `: _9 Q: D4 Z: v
'name' => 'Site Wide Notices',! M; R, K4 m- I- W
'singular_name' => 'Site Wide Notice',/ J7 U) H# }$ z( ~% {+ |
'add_new' => 'Add New',
( k/ m. v4 l2 g' j$ K 'add_new_item' => 'Add New Site Wide Notice'," F' Z- ^0 @% M% z3 ~
'edit_item' => 'Edit Site Wide Notice',
" [9 T, s& o9 X 'new_item' => 'New Site Wide Notice',
% T% P$ P3 m8 E 'view_item' => 'View Site Wide Notice',
8 i% N& H9 G9 U* [& E) f 'search_items' => 'Search Site Wide Notices',, s3 o$ \! u3 _/ c: k7 k
'not_found' => 'No site-wide notices found',
0 b N% Q0 j z" e 'not_found_in_trash' => 'No site-wide notices found in trash'. l6 A* b" {2 [2 V
);# j# E2 b( V5 P7 V- E" e
) j/ t8 y7 F( k1 Q/ t! j $args = array(
7 T5 e% G8 X8 y. h5 w* e/ J! e 'labels' => $labels,
! c. ^; g6 ~$ C3 N7 A# k3 M8 z 'public' => true,/ Z; @* j; ~7 b% j, j# z
'has_archive' => true,6 k, C) H$ B0 x2 }* z1 i: S6 J
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),5 j2 [- o8 y* F8 C! A- {
'taxonomies' => array('category', 'post_tag'),9 c. u& u, U: j/ T
'menu_icon' => 'dashicons-megaphone',! p4 {) [2 J, z$ g( R/ `
'menu_position' => 5,
_" Q7 B1 B6 n1 x- [ 'rewrite' => array('slug' => 'site-wide-notices')$ n9 n0 Y9 B1 M( {! p% e% W
);7 R- \/ U- M! U, ~
! j" ^7 u4 z l Y; Z6 z% P register_post_type('site-wide-notices', $args);' B# e3 D: J f- F% |# M/ h3 K
}9 @6 d5 {$ m) h0 ]- H4 P
```' I+ ~! P- R% C/ \
1 p* @7 e+ r5 p; [+ ~7 d- t 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。2 {, H) B# R2 m, \5 [9 x! k
9 o( M5 Y( ]. c( V3 ~
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
9 \8 ^2 b& w$ J' z: q. j' W* w" X: s5 m1 a; I, ^& l- i
```
6 b% ~8 G* K" D/ _/ Q s1 a add_action('add_meta_boxes', 'add_site_wide_notices_boxes');/ f% J" U8 h/ `" Z( S2 a
function add_site_wide_notices_boxes() {
/ N# p1 Q0 [1 o$ _0 T add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
. |/ W! V. A& G1 ?9 { }( M2 X( D3 B( _( g" i; J
5 B7 I5 e2 h/ ?5 P& Z9 l function notice_details_meta_box($post) {! ]# s9 e& U! }% i; `, G
wp_nonce_field(basename(__FILE__), 'notices_nonce');% O0 A' S8 R* z: y3 ]
$notice_title = get_post_meta($post->ID, 'notice_title', true);
. t, {& @! z6 t3 D $notice_content = get_post_meta($post->ID, 'notice_content', true);
( j. Z, F1 j7 W+ V ?>
/ b9 v, J! l! v9 z/ N <p>
9 X3 R8 j3 o& S! c$ @ <label for="notice-title">Notice Title</label><br>' |2 W1 N1 x; v$ V' L# Q7 N) M
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
0 D5 k( R& N; R* J5 A3 N </p>
) p7 s+ n- B6 O# f <p>8 a5 H) ^# }! F/ x0 H
<label for="notice-content">Notice Content</label><br>' c) N8 J, O3 {: h2 Z
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
/ K8 P) Y( }: f- P; v* m1 \ </p>
; Z) w/ w& n/ T" e# x9 G <?php
. x( A) U) K% _+ {7 c }
) S q7 ?0 Q' |% |0 f5 V& q- o. Q4 b! s j+ A
add_action('save_post', 'save_site_wide_notice_meta_box');
0 T. a* \# \% U- m7 k9 I function save_site_wide_notice_meta_box($post_id) {
1 d- I( z6 c1 J! \ y ` if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))% }* I4 ~# j" J7 d: \8 m
return;0 S9 g% z2 i% n0 Z
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
0 x' ]) M, c" W, y" H return;
+ {8 d% O: ^+ B+ _ B2 q* e; Y* v+ }# c
if (isset($_POST['notice_title'])) {
7 ~) R7 M/ E w$ K update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
1 C1 `) z& L4 B7 _! D9 w }
4 `6 |$ k; K. e8 U6 p- ^, m if (isset($_POST['notice_content'])) {1 V* o( F$ l( `
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
( o4 X$ J' T4 l, R! u: e, ]8 j w3 J6 A }
% u3 N' ~, s( B% S }. x9 t! G# f& H
```
: l- m+ m r0 {0 K3 {+ A5 b* b0 Y: k$ [4 u" y# d, A
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
1 T4 n% `; [" ~# b+ I! ^! ]
, n3 T) s a$ u6 b2 [4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
- n% C$ g# Y! X7 `! j& t/ s2 |4 E0 z3 {4 J! _
```9 c. G3 A; b( A
$args = array(9 Y( w) R ?, w9 A" ?, |4 l6 }) l
'post_type' => 'site-wide-notices',! I i# O' j0 N2 m5 z6 s+ u/ F
'posts_per_page' => 3,
. n" m9 U, l2 N) f9 v5 ]6 G: ^ 'order' => 'DESC',
! g+ q4 O1 s+ d9 P% n3 S 'orderby' => 'date'
0 O) m. l" V3 {' _5 K3 n, {$ i4 ^ );
) W& V, W) o/ g) O) y- ]7 j; v $query = new WP_Query($args);
4 ^. D. J" U! d1 T# ^6 X if ($query->have_posts()) :: _5 Q5 g* P. p! I8 }7 o+ N N. @
while ($query->have_posts()) : $query->the_post(); ?>
4 D: h+ r1 {8 H# u+ X <div class="notice">
1 R7 G: b' M2 ~9 g6 A6 Z& l <h3><?php the_title(); ?></h3>
) J. j/ Z8 @( U5 ?, b6 T+ H <div class="notice-content"><?php the_content(); ?></div>; X8 |$ h1 [+ X" Q5 L! }; \
</div>; c5 w# v3 i; }/ L& K8 H
<?php endwhile;
% S3 |. v1 Q, b% i wp_reset_postdata();% Z5 t/ b, w! D* s4 d+ U9 `) V
endif;% r2 [; b; X; u. e/ Q8 P6 L
```2 l. ?. a& h2 i, H0 a& X' q3 q
* `$ B$ S! V, ?) Q 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|