|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
1 H0 P7 c+ K: x' I& Q1 R$ N
3 w) W% L5 B7 ^: Z3 t如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
, n4 X- p8 O) Z+ m: s d6 F0 e, |% e4 M
以下是创建自定义插件的步骤:# z1 W8 E3 z( N
2 s O: W; ]/ F8 |5 q# y1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:9 q9 O& E! V. |% s! l6 k6 j% ?
; o/ p$ D k# P- h- L. k/ E v/ r ```
( A1 m$ ?) T# N5 Z1 P; b <?php6 |. A! i6 M" H
/*
& h3 G4 \9 @4 ]7 A Plugin Name: Site Wide Notices Plugin" k+ v/ c+ ~& g! ?# W
Description: Adds a new custom post type for site-wide notices." T B5 M) @+ `
Version: 1.0" S- h/ X$ H# k1 J
Author: Your Name
' m- `% l: ]! s$ ]' a j* F9 @4 n Author URI: http://example.com
5 L) q8 W2 H, {& B' z */0 z4 \8 \3 g9 f# X
* J1 y0 r5 @) t6 \+ t y0 Z
// Add plugin code here...6 _0 s1 T0 g. d3 n" H0 ^* g
```, x- s+ ]5 p1 X! I0 E
1 ?9 O7 I! _# @% v1 s
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
Q. x8 {2 g8 K/ E0 D! G8 \. ?! E; Y
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:8 l$ i5 Z1 p. }( x
: B. V. i* F9 J) B
```
2 y7 I: J9 P6 A7 ` add_action('init', 'create_custom_post_type');
" M" {! N+ u8 L$ d4 T function create_custom_post_type() {) N, n+ d3 d, `* t$ I6 B
$labels = array(, G4 ~! ^& a9 ?" E6 P
'name' => 'Site Wide Notices',. e% f. D* I/ _7 r
'singular_name' => 'Site Wide Notice',5 b" x/ ^$ y& ?2 X: W% q# E
'add_new' => 'Add New',+ W( R4 @7 Y8 {! G: _
'add_new_item' => 'Add New Site Wide Notice',
: V# z% r* N: M s- A6 l 'edit_item' => 'Edit Site Wide Notice',- k# x/ N I# |( p- K" `. ~0 t
'new_item' => 'New Site Wide Notice',
5 w: y( u$ X8 w* m# F1 F, J6 R 'view_item' => 'View Site Wide Notice',
# u1 \9 M* L" P+ F* k 'search_items' => 'Search Site Wide Notices', Z- D' p6 j. u% x
'not_found' => 'No site-wide notices found',3 ~8 v1 R" N/ Q8 e3 t* a0 R
'not_found_in_trash' => 'No site-wide notices found in trash'. v/ N* d. i3 ^5 }
);9 m/ Q0 o$ d. |$ g3 U2 E+ g4 e* i$ ?& N! A
( C( Z7 ]& ~, l( r; a
$args = array(
o i3 i7 ~7 j8 u3 X 'labels' => $labels,& w/ ^; |5 M( Q* A* I0 K. I
'public' => true,8 |0 k% x6 t* [$ I7 |
'has_archive' => true,
9 C0 U) I: r/ [, Y0 j 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
[' X, x( ~ ^% x: z2 s 'taxonomies' => array('category', 'post_tag'),
2 o" L) K0 u4 ~' p; R+ \ 'menu_icon' => 'dashicons-megaphone',' _& S- |2 t) c
'menu_position' => 5,
2 Z: [+ C8 B8 o- a4 o 'rewrite' => array('slug' => 'site-wide-notices'): v, h) q7 T2 Z0 Z/ `
);
* G& q4 W4 Y- `# b' A3 `
, t3 M4 l! }* C8 n5 K& \$ m( w( H register_post_type('site-wide-notices', $args);( t4 J7 N' c' b4 a I: W
}% N! ]' o/ v4 t3 Q" m5 R
```
3 d+ v+ n& D; w# M9 x
+ T0 M1 `# G+ Q D 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。# i* C5 p3 C% B
$ G; X R2 x! ?. `, m' r3 I2 z2 @
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:; f( m5 T' @; c! n4 L) P$ K
, _ G7 ~5 \8 [( P" v5 p
```
7 D8 v) }6 E6 s( h/ Y add_action('add_meta_boxes', 'add_site_wide_notices_boxes');2 ?# a* B9 K9 D1 D v9 E/ C
function add_site_wide_notices_boxes() {. V! k8 y( T K! D, \/ x
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
& `+ K" Z& p: `" {/ L1 R0 O }
+ d8 k. P# U) E; }( l& Q# T. ]' b7 K* D, h8 W( \/ j
function notice_details_meta_box($post) {
& N4 M" }. O" J" O wp_nonce_field(basename(__FILE__), 'notices_nonce');
9 f: N/ `7 o! @ E6 z $notice_title = get_post_meta($post->ID, 'notice_title', true);8 S6 d( I- q! f- W/ P
$notice_content = get_post_meta($post->ID, 'notice_content', true);
. ]( K% d5 y- B% M ?>. Y1 |5 T& [% v4 i' H* B/ |
<p>! E8 L) x: {" l5 ]# C' T' n4 r
<label for="notice-title">Notice Title</label><br>& U. N- i. p4 r0 R% @0 _# e
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
% r( k O7 k7 ^" w </p>0 y# s8 Z b. @. ?9 }1 H
<p>
8 }! ~8 W4 N3 T% w c: z& ~ <label for="notice-content">Notice Content</label><br>9 r5 {2 b y2 w1 f9 T M+ ~1 S. J
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>' h2 ]3 B# r( R& s5 w& q0 t
</p>
; j$ v, [" T3 m+ x+ q- H, T <?php1 U) G6 F7 |+ C# Y# e) T( a
}3 g5 h5 S) [. R3 ]
, A1 p2 v M' L7 q: T% p add_action('save_post', 'save_site_wide_notice_meta_box');% \/ M( G" A' l; Q, w0 e7 O
function save_site_wide_notice_meta_box($post_id) {
* t/ M( C' e) S- V) q$ k if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
( ]0 `, t9 i$ ]. ` return;/ K$ ^& h6 f2 T
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
$ {2 \2 ]+ Q$ w4 B return;* I* Z% d! @- F& D6 k- y+ |
$ w/ z, F. }' f7 ~5 k if (isset($_POST['notice_title'])) {
, W: Y- A/ [. I6 J update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));# ^# h9 u9 N$ O4 a3 ~( J) h
}0 s" [! Z6 P& [! z d& q1 u( C
if (isset($_POST['notice_content'])) {
2 h/ l+ Q( Q" ?8 _ update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
8 o+ E: M+ z3 e }
$ m7 i( P9 M# v }
0 U( x! _+ M- T$ U g' M$ N# N ```; c/ i6 c5 E; B5 y; ?0 p Z- j% M
, Q2 A0 y0 p, y+ k4 @, s
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。+ @. `3 D1 }$ E/ r& F0 {: K8 n
: ~ M+ t2 z( h- w2 v/ t8 N4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
9 \. N; k' o( s+ t4 Y
) ?- Q- Z/ e9 e ```8 P0 ~* ~5 d- L: s6 U) z
$args = array(. A* G1 ^2 }' Y+ H, e. ^/ g
'post_type' => 'site-wide-notices',
7 Q6 H* U" T) u 'posts_per_page' => 3,
* q, ]4 Z# ?- n5 ~ 'order' => 'DESC',
+ u9 v7 C" Z- J* q7 A1 t2 H7 C" x6 ]# z" ~ 'orderby' => 'date'" M: H8 @- h( R }7 C& o
);
" t0 a( R& m) v0 Q! S9 S# E $query = new WP_Query($args);
! |: D0 T3 E, D$ e if ($query->have_posts()) :
; ^' N* Y" \8 H5 _. d# j5 o2 ~ while ($query->have_posts()) : $query->the_post(); ?>
- _% p. H& Q3 ]' ]) Q) B <div class="notice">
0 r& ?8 E) p* M) I5 u <h3><?php the_title(); ?></h3>
6 W7 A+ W$ G9 w0 L <div class="notice-content"><?php the_content(); ?></div>$ \; v0 n& y4 _' `
</div>
8 e4 E0 `" i* W1 } <?php endwhile;3 c2 d- s4 P! w- i/ i: q' w
wp_reset_postdata();, r/ p2 Z+ x/ Y, I
endif;1 b/ [9 b c8 j. V0 e- ^% f3 f) O3 e
```
2 @, V! {1 h D, }+ h/ Q' S/ u- @. b/ Z; N2 ~* K8 M
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|