|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
0 t$ `/ ^7 a/ L5 E9 i
& O2 [% k0 |. R6 X$ ~% u5 T如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。- ]2 |7 S6 k# H- d- a7 b6 g
" H& _! \; H K- a4 E x
以下是创建自定义插件的步骤:
9 {, {+ t& Q; ?! F Y
0 r& \, V# ] @) r' H) A% D1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
# t* T! u6 |; H: _$ K- z+ M
, L- ^9 L) X. G# \$ F ```
" B& q* g6 S* l$ w) E& J& g4 J2 g <?php
! |9 Z8 U" |- U9 o# B. c' |( w! O /*% s1 U& \. V! e- T# x
Plugin Name: Site Wide Notices Plugin
8 `" C8 R! j; ]- x: g' p Description: Adds a new custom post type for site-wide notices.
5 c& m, X$ b. p3 R9 x3 @/ D9 ` Version: 1.06 _9 z4 `* \1 z6 G/ W0 ]5 p
Author: Your Name
0 f* V8 @$ U! E2 d$ X' p4 ` Author URI: http://example.com' c G% }5 T( q% z7 Z' F j
*/
/ ~% ]& Q5 p% ~1 r5 C- z- B5 p; {# |% x" M1 _- T
// Add plugin code here...
5 W9 y' F8 R0 Y# G; ~! w* c4 s ```
' O, j8 H7 H; I
) l2 k3 U6 T9 [. t( _ 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
8 F5 F; H( X$ o" n
4 t4 V% Y( u$ X; u/ l3 M& r* T' e2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:" o' ~, V: l! S E% M" f! v2 e0 `
4 d0 o; @/ r c3 {) V
```
6 Z" U& Y z* r, g Y add_action('init', 'create_custom_post_type');
* {! a8 S: m1 ?' U' u" ] function create_custom_post_type() {9 p0 r, X# ?9 R# L' s3 }
$labels = array(
# `$ K! \# l( A. M 'name' => 'Site Wide Notices',6 h" R+ o% ^& Z% L4 F7 r- q" a. ~5 g
'singular_name' => 'Site Wide Notice',+ w; u3 J( y- ]- O2 ^, P _
'add_new' => 'Add New',
; A' b! B/ j: j 'add_new_item' => 'Add New Site Wide Notice',
, i% }% t6 Z' K* g. q' e 'edit_item' => 'Edit Site Wide Notice',
4 r1 Z) m' _* J C 'new_item' => 'New Site Wide Notice',! @7 j3 v+ F, t% x1 F% F
'view_item' => 'View Site Wide Notice',
2 P8 G0 ~" Z+ c$ Z2 C! J1 {1 x4 u 'search_items' => 'Search Site Wide Notices',% S J1 J2 Q; p# L6 b' ~8 E
'not_found' => 'No site-wide notices found',* j/ m9 T0 e& t1 p
'not_found_in_trash' => 'No site-wide notices found in trash'
, H' {6 N. H& p' I );
4 | ~8 P3 Q: A, k
( o& ]9 O; r3 M# ^3 M/ K $args = array(
2 W1 z# B8 m8 C! m& t- g9 j6 H 'labels' => $labels,
$ h# [0 X2 G, Q, E+ E8 R$ n/ S 'public' => true,
5 w. t% x% N* T7 X9 a 'has_archive' => true,3 }+ ^/ k; f* e& R. n3 ~5 Q
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
! {% a) M% h. b b8 f4 v" o 'taxonomies' => array('category', 'post_tag'),
9 u! F: M; Y& O 'menu_icon' => 'dashicons-megaphone',4 x4 u! u# G6 G
'menu_position' => 5,& V- Z, Z8 @) c$ I- ~. x3 r& c/ J/ J
'rewrite' => array('slug' => 'site-wide-notices')% |) Z' ?( N$ k. V4 c! i
);
0 S: R6 d: k1 ]6 L; N
5 z+ }6 x; s& G2 g: ` register_post_type('site-wide-notices', $args);! l0 q* J( f s5 I# r
}8 O6 d" P7 X0 P
```
" Y$ P3 H }, L: n) @% j- S5 R, T/ Y2 }" O8 u7 x' J l
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
/ ?- v* o# {! L. c1 O
$ C7 ^9 Z: x4 x9 Y; A! h8 N2 f7 |3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:# P4 I' v, C- F9 A) p* R
9 E' U/ B' G/ a' C! Q7 s ```
' I8 A. o% t" Y" F3 z add_action('add_meta_boxes', 'add_site_wide_notices_boxes');# k7 Q0 g+ d3 d/ d/ N! N! Y
function add_site_wide_notices_boxes() {
7 y+ d( N# A+ _7 C+ h add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');9 M" D' }3 b7 ]. D+ B
}' a; L4 ~+ n( y6 H( I" e' n% d
: A& {# ~0 _/ ~7 M4 ` function notice_details_meta_box($post) {# d2 |/ S( t, F
wp_nonce_field(basename(__FILE__), 'notices_nonce');& u/ g" N/ f) ^, j' Y7 t0 l+ T/ _% u
$notice_title = get_post_meta($post->ID, 'notice_title', true);6 M; u, f0 O3 { r6 _: d& U
$notice_content = get_post_meta($post->ID, 'notice_content', true);
7 F# Z. X# z/ H& @+ b9 w7 z* V ?>
% Z5 l% o0 K4 p# [; X3 t <p>
H- d& \- G- M <label for="notice-title">Notice Title</label><br>
6 X: Y8 |+ q: A- P: p- p U <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
9 `* H. ]0 J+ |6 ?3 w; W) | </p>
" y8 r! P& o# b# ]4 ` h) H# H <p> T8 j9 Y- G }% b; @( {
<label for="notice-content">Notice Content</label><br># \0 A: ^5 j5 l7 k/ N
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
' y H. {( m T3 W- U# N6 n7 A1 u- N </p>
( G4 q% F8 Y+ T7 U6 o <?php
2 s) z7 R6 o% M, _$ q/ y }! y; ]8 p& O; a) r. W9 ~5 j- m3 s( y
* R& Z$ ~3 Y. B l
add_action('save_post', 'save_site_wide_notice_meta_box');, f/ Z0 \7 @8 K& c D% y
function save_site_wide_notice_meta_box($post_id) {8 R! W$ h2 A1 C2 ]& r* ^
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))# m% d; B) _; ]: u/ x- y
return;; B2 x! j/ C6 @) m) W
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)- t- j0 c* i! q
return;" Z6 W7 Q8 R, R4 B) z+ |
$ l. E2 u1 Y% ` H5 i# c
if (isset($_POST['notice_title'])) {
6 @1 G" I i5 q; G. T" y update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));$ }! ]5 E |2 o1 M9 H% A0 u
}
! S8 p' H3 x% P7 q9 {6 P+ C$ \# A if (isset($_POST['notice_content'])) {
6 i! i2 _0 t! p; Y update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));9 Z9 E5 q. A1 F- A, |
}, z/ p6 H6 Y2 i
}& B* ]7 a0 k) r0 w
```) Z2 T1 q& D4 K; h4 i
, b T a: M# r- O/ s! E3 W 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
( ?& T9 Q) m) p) j! `. _. y7 B! S; _& p
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:; @' Z! G8 ?8 s/ s9 Y1 B
! c% F6 G) \1 `
```
( k' f7 a/ i; Y' i $args = array(
9 E2 `' x4 i! H- A 'post_type' => 'site-wide-notices',! Q6 v" Q$ k N6 a: H
'posts_per_page' => 3,3 o6 U/ X/ g: V
'order' => 'DESC',
1 H( A3 E/ N" f4 f# V- k 'orderby' => 'date', R' E% _! A5 J) M5 D% v
);1 q2 b2 L [5 B: l% ~& Z
$query = new WP_Query($args);% G* V; m) [4 O3 I* U: Z- a
if ($query->have_posts()) :7 D% _9 W, B2 _# Z+ l
while ($query->have_posts()) : $query->the_post(); ?>
" T( g7 t0 D' T+ x; E& I4 z" }& ~+ v <div class="notice">
3 h/ u } @, t. ~" C: O <h3><?php the_title(); ?></h3>* ]7 A; v( L% ~ ~$ z$ D
<div class="notice-content"><?php the_content(); ?></div>
' X* e! \2 g5 n, b1 [ </div># O/ k( Q) k6 Z- [& l
<?php endwhile;; H9 \/ ^$ g* f8 T! W8 a
wp_reset_postdata();
4 g' @5 T: Y& C1 k( E, O endif;
$ O. s' j, ?% T( f, o. D ```
\2 T# C! D: `. a, p; M; P9 {
) c! V$ ?6 A* b& t2 f 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|