|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?# a7 P* X2 m4 k, [5 d. a- }
" P6 C4 ~" w9 Y3 G* E; l7 k4 D如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。0 n4 G- P1 R! g9 u, ]% g
{8 h* h% z% a' B; X4 `* o4 H- T# k
以下是创建自定义插件的步骤:7 G6 k H& ?( a& x1 {& y$ g
" p) a& b% X& G
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
6 L1 W8 A8 r7 S- \' X. c/ {6 n& z0 g. b; ~2 O' @, R5 }& ^$ I
```( x; G2 _7 C- n; R& t
<?php3 V% }8 u# ?6 c; i# W
/*0 W; e$ ^. t5 U" { c4 `
Plugin Name: Site Wide Notices Plugin, [4 G+ a# u3 a0 I0 I. c& p
Description: Adds a new custom post type for site-wide notices.8 r- r7 c+ `4 H5 f2 x( J% ^
Version: 1.0
+ p9 K ?/ b1 _8 [1 |% v0 J3 z Author: Your Name
! \6 P: C1 h& H S( d Author URI: http://example.com
+ ]& q* p/ U- e% F& J; _ */
* c# M& `. o: F. _1 {: @' o: A
; S2 V g7 o4 p$ \1 ]/ I: g v // Add plugin code here...
3 [5 v+ a+ v$ u; D) p! i4 l' z) L! w9 y ```/ m7 ?* z* V4 {& G0 o
/ h p0 c3 O! A4 M! i
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
4 M, h' G. p: B2 h5 s
* i! D! h8 c q Q2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:6 b; U) ]3 h- k! @
) N7 m. C) a0 f; U3 _ ```
( i+ U; P! ^4 |3 p- ? add_action('init', 'create_custom_post_type');. C U Q( J- o
function create_custom_post_type() {
4 M0 _$ e6 t% X* K $labels = array(1 {0 i' s3 R5 r. |
'name' => 'Site Wide Notices',
' l9 k5 B5 z, x 'singular_name' => 'Site Wide Notice',- I" D" `2 o* z u
'add_new' => 'Add New',* c0 d- O" ^7 d4 n2 `5 V7 v. g
'add_new_item' => 'Add New Site Wide Notice'," _. {+ y `3 K# b0 v3 c. Z& u# T
'edit_item' => 'Edit Site Wide Notice',/ w9 R, \2 }1 x
'new_item' => 'New Site Wide Notice', ^5 A4 Y& j; x- S. }
'view_item' => 'View Site Wide Notice',
) z0 {' }! ]" I1 |+ E# S; r 'search_items' => 'Search Site Wide Notices',
0 e; H: e; ^+ M6 G4 U* Z1 U3 l 'not_found' => 'No site-wide notices found',# F" I; K# o# V) J. H2 {/ j4 F- A
'not_found_in_trash' => 'No site-wide notices found in trash'3 t" g; e( M" F5 \) \: r( R
);* B e/ Y3 I# A0 r
' ]7 w0 o9 p6 \) ?
$args = array(
, B% C# H* c; d3 ^6 h9 F# ] 'labels' => $labels,
" i0 r6 q" w4 U' i 'public' => true,1 n; q) `: i# _+ F
'has_archive' => true,; Q; R7 k) g& v& }! C; w
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
5 ] Z8 D$ ]- }3 ?5 M 'taxonomies' => array('category', 'post_tag'),
. O6 o# w8 ~1 U- l* ^4 t 'menu_icon' => 'dashicons-megaphone',
' R2 B1 D: M7 J6 Y$ L' o 'menu_position' => 5,: s/ j. }: Z) o* V! @
'rewrite' => array('slug' => 'site-wide-notices')
) ^, v$ S0 o2 @/ `8 u );& P/ e: j" c- ?/ w& y
/ |) H/ j7 N4 _# s( u# P9 ]! H% e register_post_type('site-wide-notices', $args);9 @& J$ w! r+ g) U. O$ j6 f9 B
}, Z0 i2 L+ H. J' j" `9 z
```0 N- M( h0 [7 e+ l
1 l }. A7 t+ M0 D7 {; V$ d 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
8 X; j3 s# t2 P3 ?" q
1 ^9 i E- `+ ]6 {% A+ c$ \3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
! @# L0 a* A3 M
7 A& F4 A* d8 Z* @2 t9 b ```
e0 y! z) J2 a* j- ?) P4 v, z add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
, a' F) u) M4 I. e function add_site_wide_notices_boxes() {" {3 T/ V l9 ^& S
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');7 N3 S* [3 Q9 y% g; C6 b
}
3 _/ P v; v5 t7 G4 N' S9 x: [
* T P8 }0 o2 O. I/ S+ o function notice_details_meta_box($post) {/ ^! `) H" i7 j# W# [0 \
wp_nonce_field(basename(__FILE__), 'notices_nonce');
6 @2 K- W; k* v T8 m $notice_title = get_post_meta($post->ID, 'notice_title', true);4 y% W/ P! p" M- I( @6 d
$notice_content = get_post_meta($post->ID, 'notice_content', true);
: c, }, i0 c9 v) s/ ?+ E ?>, j! Q: Y+ c7 n- w
<p>. z8 a! S% _) d+ N/ ~ s
<label for="notice-title">Notice Title</label><br>
' N) r' [- f9 p/ H <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">! D. }7 ^# M5 X( u3 d
</p>9 C% Q" P8 F; ?* m
<p>
; D, c2 {4 z; X! w" Z: R2 _: S- F4 M <label for="notice-content">Notice Content</label><br> M0 Y! r! J" k6 {9 T# W
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
6 D X' \8 x. _( U </p>- N/ m* ^/ L3 s w: j0 p, G
<?php
- h% t3 C, e2 z5 {) v: U }5 Q2 N2 I! k* P' a
9 l% ^2 Z- ? r$ h7 `+ m" C/ K; ` add_action('save_post', 'save_site_wide_notice_meta_box');7 P! J- \( G0 h( ~4 S9 F& u T# _
function save_site_wide_notice_meta_box($post_id) {
- G' l3 r$ ~( K6 y if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))) _: M, ^$ {+ U) h( O8 J
return;+ d2 y$ Y7 g! S: y
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
4 o0 W& V, L: r+ Q3 D+ y0 N* M/ k return;0 P: [, `8 V7 _# y3 U
1 w9 ^( w+ t/ }. i# y3 w; i! l if (isset($_POST['notice_title'])) {/ ~* B8 r0 \# T1 L1 A$ `6 _
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
0 H* Q$ R! _- K: v: h6 j3 N }8 g5 }- |/ ^5 A$ L# j
if (isset($_POST['notice_content'])) {
) D7 k0 B6 M0 E# O# B1 y9 ~* w update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));- U9 a d! b1 P7 U/ D C# ~
}
6 d! S! p" S E& x$ U }9 K; d) V# P" ?+ X0 s
```
# h! }! ]4 M; Q- v/ _& p6 y8 h4 P* ^9 ?9 F H& m9 P
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
; @. X* G" k7 I( E: G* Q! ]% w; p# s' h, N5 N2 u7 f6 r8 V4 x) i( j x
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
$ m1 Q8 D+ C0 Q& W
# }2 J) k7 b" D, M' K, f( ?# J7 Z ```
& Y% K" E9 y O $args = array(+ c8 Z3 {# c" J( k4 |$ O4 W
'post_type' => 'site-wide-notices',$ S; N/ c* }# u' m- g
'posts_per_page' => 3,( b& y0 H! W7 W: P! w
'order' => 'DESC',
+ r# z4 b0 b3 r! o) W1 B 'orderby' => 'date'( E! l5 g- V' \2 D' k" i
);+ M5 ?: b" l( q0 u: X8 m
$query = new WP_Query($args);$ [3 |2 y+ F8 D4 j+ l1 O; f
if ($query->have_posts()) :
0 |/ v8 C- h8 E k4 Z while ($query->have_posts()) : $query->the_post(); ?>
7 L* c9 W* ^% Y# V, b <div class="notice">3 Q6 L+ {& Z& z8 o
<h3><?php the_title(); ?></h3>
4 J& a8 s* u9 _* J& F" W1 f. [- `; E <div class="notice-content"><?php the_content(); ?></div>
7 @/ Y: @4 l/ ~1 L+ I </div>
5 R% J3 R; D/ |1 n8 g% {1 G; E <?php endwhile;
Q: q {/ S7 ?8 p' ] E wp_reset_postdata();8 D* p" l: B! q+ O& c `
endif;: {( p/ r) a5 j: _
```+ m: u$ P! a7 t( _ r
/ F+ {/ Q1 x* B& U; x% K8 W6 [4 B( |
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|