|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?" P( _, b: G, W3 C
" {. a E0 W8 D; [' N, }如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
) ~+ w$ B8 [$ Q0 |! J1 N7 a4 \ R$ ?" i; h2 o9 T' I: O' W
以下是创建自定义插件的步骤:
, d( n# F! K% z/ f& T
! U8 e. D$ {$ \" V3 F1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:* w. a( _1 F" n9 j/ r7 n+ m2 b
# u0 _! h' e% r* M. |8 @
```
1 V; ]3 N# F+ q0 y8 w: v% a <?php
0 p0 d6 E" d# E /*
' q& }3 C) o: J! Z Plugin Name: Site Wide Notices Plugin
3 w$ I! z- x+ r" x Description: Adds a new custom post type for site-wide notices.& p! l, d3 X( E! r& W( Q
Version: 1.0
! ~* s* W4 J" x$ T1 R+ G Author: Your Name
9 b' a1 F- C7 Q5 }* T5 S& m, o' W# n Author URI: http://example.com
' g+ C" j+ o2 l- i( U! e */
' f7 _. p/ ?% Q8 k; W! `! n- C; l7 e
. d. |+ g( j* H% }# | // Add plugin code here...
& e$ u! f9 o8 V7 D2 E ```, v. I5 i* V2 o) s" a& F# |
# @, s8 O- ], o2 f2 B+ d
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
0 \2 [5 P+ C3 N( R8 W
" v" c1 R# z; K5 F1 N5 z2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
# Y3 i- Z# D) ]; b. z9 ~6 q7 k. J8 j
```
" _+ d3 P' ^1 ]5 D* c add_action('init', 'create_custom_post_type');% T# _; O3 ]. `1 v7 S: z
function create_custom_post_type() {
* a% j7 X2 b0 E7 H! T8 M $labels = array(7 m% B: ~) ?+ k2 C. j3 j
'name' => 'Site Wide Notices',9 y, H7 k; M% w Q; ?
'singular_name' => 'Site Wide Notice',: [+ K7 @' U. ?2 w2 O5 |/ b
'add_new' => 'Add New',
# z1 d! c. W% D5 i( @ 'add_new_item' => 'Add New Site Wide Notice',7 Y: k* ^; k4 ?' L2 C2 Y
'edit_item' => 'Edit Site Wide Notice',& E* @1 \# n& q& T5 S
'new_item' => 'New Site Wide Notice',
7 k7 s& w! ?0 h* k* F% x 'view_item' => 'View Site Wide Notice',
+ n# R0 ^. {- u4 N% F, c, r9 `' O 'search_items' => 'Search Site Wide Notices',: A3 {8 ]' i# L+ Z, G
'not_found' => 'No site-wide notices found',
# C+ u' W# m/ [3 \ 'not_found_in_trash' => 'No site-wide notices found in trash'' u8 v- X% y& \2 H0 L1 l" w
);+ d# b9 @* y; V) [" P
2 l5 t: h) b. M $args = array($ D4 h8 E: R3 ] B
'labels' => $labels,
# q5 _0 k, Y! g 'public' => true,- f" f$ r1 i! e0 k
'has_archive' => true,
) {8 v2 g; C) s1 g/ P 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),6 j2 i9 C; R4 m9 I' Q: O) x- S, Z- @
'taxonomies' => array('category', 'post_tag'),% a: N$ L, j. N* ]! G+ s# i" @
'menu_icon' => 'dashicons-megaphone',
E: z7 @ n y0 O% e! O 'menu_position' => 5,
8 W" H( Y( u/ |- p! L/ G4 N 'rewrite' => array('slug' => 'site-wide-notices')
7 d/ ?8 }6 ]6 ?* v1 z- D5 A );
* x7 B; X" e# G' D- [1 @3 r" p7 P' r& t1 A2 W
register_post_type('site-wide-notices', $args);
0 \2 o# M1 U" u" ^; L }+ f3 L4 w( a4 A1 c
```) }+ [) p7 ?- G
( w* }: t' I" u9 E0 z4 L) O2 L 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。) z8 W9 ^+ g$ U* h9 ?9 z3 j
: T" z( z2 s6 b2 ]9 \
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如: h1 g! b- v5 K+ Z
8 p6 P6 G# l6 ]+ \, l1 ^, N- B+ ] ```
" l- p% ? X; H8 r. \! E/ v9 {* r add_action('add_meta_boxes', 'add_site_wide_notices_boxes');. i& X. l6 K/ v( r% O- H) Q$ e5 v
function add_site_wide_notices_boxes() {4 X& t- ~) ]# i s) Z. h& t8 \
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
, a0 r3 J; L% y; I }
! W0 ?2 n7 L6 a( {- Q- c4 w( R3 D( C; x, C+ N
function notice_details_meta_box($post) {+ m g' ?2 @, x+ Z3 I
wp_nonce_field(basename(__FILE__), 'notices_nonce');# E" [" @8 f& {2 K6 t& U
$notice_title = get_post_meta($post->ID, 'notice_title', true);
|* @ ?0 }6 z. |5 w& D $notice_content = get_post_meta($post->ID, 'notice_content', true);3 ~7 r2 o- ?5 I# {+ X% M+ m, ]
?>& m. A) J* K1 K
<p>/ W) e1 x2 U* H% R. n( A
<label for="notice-title">Notice Title</label><br>
1 p6 q' V, x& r <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
8 q! B; }; y, N& X3 m! C, ]% b </p>3 C' W! T/ b# X( I+ @6 V. L! p" c! X
<p>+ v# `2 e K: p' Z& Q1 Z; B
<label for="notice-content">Notice Content</label><br>. U0 ^1 `2 R1 G3 g8 }
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
l5 i# Z4 \+ `7 p7 x+ d- ]# r1 T </p>
" j4 C) \. m3 a4 l7 b; } <?php
; q% E7 k: O; t) s0 d+ M$ h }
+ ]) C8 E# J* u+ f( y
$ F ]( G" P1 f* \. P5 \$ Y add_action('save_post', 'save_site_wide_notice_meta_box');
& ]7 p( d' J1 l7 M6 Q/ @$ R, X function save_site_wide_notice_meta_box($post_id) {7 w a. O8 S/ M+ d
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))6 w% [8 V, [9 X9 r; `
return;
- b6 O/ F% J. j" x8 `. } if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)1 S% z: B# z- r4 w
return;& f4 l) S- o0 d0 C0 ?& k2 u3 [! d' c/ @
" p. a \! n( X- c# ?" Y$ a/ o if (isset($_POST['notice_title'])) {
" T& M" o8 [$ c4 o# y update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) c, J6 Z2 \/ Q9 i8 o
}1 V, z2 b, ~8 W1 e
if (isset($_POST['notice_content'])) {
7 r% y: y4 G- E& w) P6 \ update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));* p3 {9 T2 O: q, u: o# O! i5 |4 D
}
4 U) z! Z8 l R2 H! Y }0 o; s0 t8 L9 m' H7 ]& x/ Z
```
9 b4 h6 e1 ?& L+ O
9 x3 N l. b/ ^1 ]4 `3 x. j3 G 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
( a/ o. O5 Q6 I+ z3 u( O$ `- x& E3 g1 M3 K+ h
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:# l7 V! _* O0 {( o# y2 x
- L7 b* i: x3 L# t h6 e' G% T ```
) {: c) {( w/ O1 u8 ], d $args = array(; m9 c% ^( z1 l5 W7 o' z0 u/ h
'post_type' => 'site-wide-notices',7 e/ N! k( b7 ]8 |- {! s3 A( B0 U
'posts_per_page' => 3,5 n+ d+ s4 t8 N% `/ r
'order' => 'DESC',
R/ Q" \' U5 m5 N# { 'orderby' => 'date'% B4 m# X3 P" `: v m- h
);
9 `3 f& L3 P ?3 Y $query = new WP_Query($args);
; w, `" e+ e$ [) t+ W if ($query->have_posts()) :0 |. K, v) _) `5 R
while ($query->have_posts()) : $query->the_post(); ?>
5 y C t4 k2 P0 E <div class="notice">5 u# ~: S; g b! R- m+ v. Q
<h3><?php the_title(); ?></h3>' y5 V+ W2 d0 P- b
<div class="notice-content"><?php the_content(); ?></div>
- }! {5 S$ Q! K3 \& d </div>
& {, _" w% y8 g! @( G- f8 C <?php endwhile;+ x+ h5 C- Y( k- y* I b
wp_reset_postdata();
: K4 L Z) E/ ^, z! \. ]9 L: B endif; W0 b( ]+ a) _, H
```
1 j) h/ S, o7 V( T8 l+ L4 L8 u' O: \2 W2 |5 }2 X4 {' p2 H
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|