|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
: H6 }5 B7 g4 V z4 W) @- ?3 z! y
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。; ], B6 [$ ?: p& D+ ?) t
4 ?4 X% N2 l' v3 @0 E3 ]$ O0 H
以下是创建自定义插件的步骤:
# @. M7 ~. y- B* n5 ~
0 I6 Q; f: Z# f8 ?6 y( \+ D7 k" c1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:& T! t$ r/ f2 n5 T& `1 @
/ h( T% {3 g* P+ n4 c ```- w/ X2 x& g- n% X& g
<?php
& z* Z* T3 a) P/ q# Z /*
' P4 [+ o+ H3 E0 f0 j5 d) ^ Plugin Name: Site Wide Notices Plugin
% z" {' ^) D- }1 a Description: Adds a new custom post type for site-wide notices.: q# R3 j4 G' J2 s
Version: 1.07 N* H6 M- A9 [+ W9 a
Author: Your Name. v0 V" D5 S, k) ^' i
Author URI: http://example.com
, u. e! _9 ]7 c9 o( a4 @8 G+ c W */
& ^1 y+ m3 ^; Y- V
+ k$ A- \+ W: O6 } K; p' P // Add plugin code here...$ F6 K9 |0 |/ H8 x% }
```# E3 b3 B- L2 y0 Q: V# R7 H$ D5 |
) z9 v. s$ `# x; i$ w 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
6 Y' k/ A- `) G: z K9 B. B
" f# J0 J W0 c2 W2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
' L: n, f: P& M/ Q- t3 X* L1 a5 U1 ^" c. A$ o8 x
```: D, D9 A/ A$ T1 i5 t* ]! G" n
add_action('init', 'create_custom_post_type');" o j* U+ d# x
function create_custom_post_type() {& `- V F" G7 X& c' \% ^
$labels = array(
! ^. y9 a3 {7 V9 K+ z7 Q 'name' => 'Site Wide Notices',
; n% Q$ Q- f' H) t9 R 'singular_name' => 'Site Wide Notice',
5 ~ a+ v, d: s+ Z" ?' ] 'add_new' => 'Add New',
! R" u$ e3 {& [9 m5 B 'add_new_item' => 'Add New Site Wide Notice',! O) y0 F6 A4 ~& {8 {
'edit_item' => 'Edit Site Wide Notice',& ^" P# r8 e8 Y1 c2 i
'new_item' => 'New Site Wide Notice',6 ^, t- {+ L! a; G0 W
'view_item' => 'View Site Wide Notice',
. D5 E+ K2 \! c% Z% ^- v 'search_items' => 'Search Site Wide Notices', W( r( f+ A" `$ Y
'not_found' => 'No site-wide notices found', ]$ T& _; e! H/ R$ S5 Y1 E
'not_found_in_trash' => 'No site-wide notices found in trash'
1 t, G$ Z/ \9 q );
3 v/ I4 |& X2 u: i. Y# v- ?' \: k8 b* k1 R8 p }) i0 s2 l& |
$args = array(3 `' O1 ]. v) L
'labels' => $labels,
8 ?; u# n) j- x" ^& @ 'public' => true,
3 Y+ _5 w5 J9 L/ O* i 'has_archive' => true,6 h- w% \& Q: H0 w& ]! [, A) x) e, x
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),* r5 j. ]7 F# r0 _+ b
'taxonomies' => array('category', 'post_tag'),
) g( h) ^# h+ o4 d/ }9 n I$ c 'menu_icon' => 'dashicons-megaphone',+ S3 N2 J8 S( Q. b/ [/ d" l
'menu_position' => 5, N7 M; y# M. @$ Z. U) l
'rewrite' => array('slug' => 'site-wide-notices')+ ~+ A) I6 Y. g. }3 f7 D
);
' c+ x( s$ e& {. g- g9 q% ~3 Z$ y* ^8 C4 U1 _6 ]
register_post_type('site-wide-notices', $args);- |/ c) B3 k/ ]( p" f: m
}% Q5 n R' V" V* p
```% \8 C/ n+ I+ l
9 R' n& A, {3 H% J. b& ~3 G- U
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
9 ~7 o F' d' Y$ \% g3 J/ z2 F4 A0 w
0 c7 C# T$ t7 ~. z" B7 \1 p7 g4 s2 g4 o3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
" N3 i/ [0 i/ K- r* ~* p8 S
4 k! e/ G* _0 P. G- O4 x ```
1 L V7 k1 H7 q M add_action('add_meta_boxes', 'add_site_wide_notices_boxes'); y r4 P; Q/ F# s
function add_site_wide_notices_boxes() {& t, Q) ^- C1 f
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');2 f2 Z6 a' u% j% G* C
}/ w: b2 d: U% H4 o
0 a$ F; i* L, [- p3 O
function notice_details_meta_box($post) {
# l! D- i/ o& V6 C8 e wp_nonce_field(basename(__FILE__), 'notices_nonce');
8 X% C! [5 n. `( N; I$ {0 \ $notice_title = get_post_meta($post->ID, 'notice_title', true);
/ ]: C# F) V9 ?7 N( d9 d. H* A$ X: N $notice_content = get_post_meta($post->ID, 'notice_content', true);
a* @/ Y, D* s ?>
8 F( e( K0 w" V' c6 e' ]! A5 F <p>
& D' U# K0 I5 B# o& z4 }0 l <label for="notice-title">Notice Title</label><br>, K3 O8 i k/ y' M3 X; ~# J
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">) r; P F. _2 s' ]9 P0 P
</p>
. f9 z- U' m. M. b <p>
( c4 D1 ?' P% {' }0 ~2 ` <label for="notice-content">Notice Content</label><br>* R' m/ N0 U3 L
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
$ O) W t1 w4 l7 ]; J6 u6 E </p>; X/ _9 E8 ^2 a& _
<?php
- h: z+ o( Y5 t' }" I }
8 E8 A+ W# V8 n i8 t ]) B& a; z8 e6 i- {9 P4 U x3 @
add_action('save_post', 'save_site_wide_notice_meta_box');) d, _- p( u% v0 m
function save_site_wide_notice_meta_box($post_id) {8 l9 f8 H* M3 V3 x b
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
}3 F# b/ n# X8 V) C- B; C( U return;9 l! J# N( u) b6 P( M, N i' }% r
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
2 u! p" Z; C; N( s: f) \ return;
1 g, j! b6 Z; B9 P. j7 E! D: ^) r( z( t
if (isset($_POST['notice_title'])) {
6 ^8 W4 j0 c; _2 N B/ i update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
5 X# V" {; E$ ^7 H }
. E$ X# h9 F% Y) E& Y# [ if (isset($_POST['notice_content'])) {7 I/ G0 s9 m3 N
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
/ b, _) H4 y+ z* c }
$ ^( H* t% Z. p }
, `4 a" U( z s) i ```
/ M9 g5 c( {/ M' b/ s) k/ J
3 T$ y4 k" U8 u, ` h5 Z 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。( z g7 O3 P$ l9 Y; V8 p+ z
3 X4 N7 h8 G# n w; z4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
/ Q5 l4 h+ E0 i/ T$ j% P" Q. e
```
6 H8 @7 q3 }5 u $args = array(
; j* w/ V; T6 `4 \/ J; T 'post_type' => 'site-wide-notices',
! ?' j' D' j: w/ a+ J9 y5 J 'posts_per_page' => 3,
4 {4 `( i4 ~) S 'order' => 'DESC',9 ]% e; |( p% Q# Q) Z" r/ F! }
'orderby' => 'date'3 _; j1 | N& @, `. q
);
: q, U; e$ H' t8 s" l $query = new WP_Query($args);
; u, O, Q" J! y% y1 A* K' n, Z9 ] if ($query->have_posts()) :* p p6 v6 g9 O; B. A, Q& S
while ($query->have_posts()) : $query->the_post(); ?>4 F: l+ X- G: h8 y. ^
<div class="notice">, z6 R. K# d5 p/ x: ]2 v
<h3><?php the_title(); ?></h3>3 P" {: u' Q$ K5 ]8 f/ k% `
<div class="notice-content"><?php the_content(); ?></div>' A ^+ z+ W& `9 k; P, f
</div>3 `- N, |' x9 R f4 y
<?php endwhile;
+ O( ]6 F+ q. a: j4 k9 ` wp_reset_postdata();
: _' Z: c7 {; Q9 R3 v& X endif;
8 s$ A7 O4 D$ b) E9 D* x% a ```
6 d: X. j% j2 |7 e1 h6 u7 }# D! _& x
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|