|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
' _) u0 f C) s. l& e/ A
: c% U) {5 n e+ `8 s z如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
9 ]8 Z2 _ q' O- O' h a; a2 V) y$ r; }: z* u1 G- o
以下是创建自定义插件的步骤:
/ ?5 A: r3 W3 u" l- E8 E9 }2 {# x, W! g6 \8 @: ~
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
) ?6 J& K7 E: H7 u) D, e! y4 q
```% d" A! R3 W2 |" I. Q A
<?php
@* `8 i Q" U% y& ] /*
# d7 m! i7 u* M. _- ]* u Plugin Name: Site Wide Notices Plugin
. B! R* Q& D1 w/ \ W Description: Adds a new custom post type for site-wide notices.
, t& m' H9 W) N% h$ n! |& J Version: 1.0% V) F: R* p+ s) v
Author: Your Name
4 [ q4 ?2 v- q; f Author URI: http://example.com
1 m0 o7 }# \; } */
- H1 r# x; p+ ^( Q- D4 N9 }; L2 @5 \; z* b8 k- x6 ^
// Add plugin code here...
2 L) d8 E3 m7 c) G ```2 \" r9 ?( w1 N. G: N- n1 w
2 [ W, {& g: o1 q0 _2 n
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。2 L! u- l( F% x. n- A" B
" V7 v0 |. k) m6 Z$ M% J
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
+ b% ^! I- y5 p- s C5 N, \7 z9 r# @$ v8 y5 w" a
```" I" M/ p4 |* ^+ t
add_action('init', 'create_custom_post_type');) r a% V; \3 L; u5 e, {6 D" o
function create_custom_post_type() {% N. x. Q% i3 A/ S$ ?3 E1 K
$labels = array(
: y1 @) v. P7 k% z% J- r |- b( o 'name' => 'Site Wide Notices',+ ^( u" v: X2 h$ o
'singular_name' => 'Site Wide Notice',+ w* R! c0 {$ O0 E* B
'add_new' => 'Add New',
) t% e$ g4 P2 \* h# Q2 I" ?2 D 'add_new_item' => 'Add New Site Wide Notice',
, s' o" r+ c9 }% C1 G* l 'edit_item' => 'Edit Site Wide Notice',
1 c$ s8 |7 q8 s7 _( r, g) k9 w 'new_item' => 'New Site Wide Notice',5 B2 r; v' w2 R. j- J; A% P
'view_item' => 'View Site Wide Notice',
( ^$ G+ T: c( D% v 'search_items' => 'Search Site Wide Notices',
Y) G. f9 B+ b, P8 D 'not_found' => 'No site-wide notices found',
! N0 j- z" ]& \9 I: r 'not_found_in_trash' => 'No site-wide notices found in trash'
# G9 _8 @1 r% n, X );
, A; U/ P( u$ R7 l; y$ _. i/ Y# t& h/ k
$args = array(
! y9 f8 {3 b: ^# {8 B& P$ ^8 @. h 'labels' => $labels,
6 J5 U4 U" b) a, U& ^ 'public' => true,
. [$ S V2 w7 n* a( e7 T& y 'has_archive' => true,+ ]; d0 b5 I- s1 j: N: x* e/ ~3 s
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),+ e: C2 U+ k V: D; K0 d6 l
'taxonomies' => array('category', 'post_tag'),2 {9 t7 B+ W' Y; O: a
'menu_icon' => 'dashicons-megaphone',, F; P! e9 p7 L7 v3 v
'menu_position' => 5,9 |2 P) Q3 H. [) w+ ?( P0 ^
'rewrite' => array('slug' => 'site-wide-notices')# m! |+ @9 ]7 J
);# G$ @4 h7 S* a* h3 q* s
/ m3 H) O! F6 B5 W1 L" q
register_post_type('site-wide-notices', $args);+ \7 c& J4 _' V6 s
}- P# @9 s& s: t- e$ q9 s
```' ]5 p5 j( P; F# w
; S5 d7 W/ ^' O7 c8 ]
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
$ T3 J) _+ v" s( Z8 e/ p. ?8 J Y( L% c
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:. N: N( C% t; Y, B
9 u9 |7 n. {4 P
```8 g3 V @( Y1 z" j; E3 c
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');3 P3 h+ j. B+ W
function add_site_wide_notices_boxes() {
1 Q' r5 j7 q" H add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');: V( Y+ R) G( k2 `1 C
}# ]% r1 ] p: P- ~. L+ c" \
6 ?3 M t& ]& n- O' H2 N% y6 H
function notice_details_meta_box($post) {
& l. v$ J* v, s4 w wp_nonce_field(basename(__FILE__), 'notices_nonce');4 B* Y j$ Q% J, }
$notice_title = get_post_meta($post->ID, 'notice_title', true);
, q4 c# E. M( \6 d $notice_content = get_post_meta($post->ID, 'notice_content', true);
. b7 `; p; e. v e( d ?>
. y6 b8 v m% {0 n <p>. ~( X9 k* S) g
<label for="notice-title">Notice Title</label><br>% W3 D. |6 q4 M
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
5 N5 {5 D/ c* h </p>8 q) u2 O0 d, C: }* C
<p>
5 ~$ p) m4 C T$ o, r <label for="notice-content">Notice Content</label><br>
& q9 t @' B, }# P+ M <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>5 m3 _" e* a5 z3 r
</p>4 h( t ~: c! d! E2 b: H
<?php8 O7 T! B; `: A0 }$ s
}2 A7 Y" K4 G& p! K0 {) c* Y
- g8 n& E$ y% `$ Y add_action('save_post', 'save_site_wide_notice_meta_box');
1 _. ~7 M" f- Z& _2 L function save_site_wide_notice_meta_box($post_id) {7 W0 N# y: [# T! A) I# `+ D
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))# p% h# v1 q0 m" n _& T& E
return;
0 W( ?1 _6 u! `: | if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
# j; u$ ?5 [ L- m7 ?- V; E return;
1 Q# `6 o" b% m6 [* U* e4 x% ~/ I6 P' i
8 o4 l5 X; @) E/ m if (isset($_POST['notice_title'])) {
9 s1 H, R) o- H6 C4 i) N- T update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));8 H3 j, G8 O Z7 o
}- `4 o- |$ g8 a; L: C# Z& J
if (isset($_POST['notice_content'])) {' m; s7 Y' r( p, q* I
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));. n g9 u& [8 C1 B+ P
}
9 H% \. u) M, }' ~( w+ Q4 H* s' f }
5 \1 N# D3 O5 R/ U7 W ```
5 P2 e! ^" N" ~5 g- O$ C S% B1 |) j$ E& |
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
4 f$ ?# `2 I" t2 i8 H! b$ p1 G& C; n2 @: D3 R
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
1 \- H4 u4 M) @! @% {, {5 f3 U. z% @$ }3 X3 |
```# i' ^5 B! L0 t: H
$args = array(
( V8 b' Q u' B 'post_type' => 'site-wide-notices'," c" Y4 W ^) {
'posts_per_page' => 3,
4 g6 |" z; L' Q+ V+ Q" `+ H# Q+ \3 k2 _1 { 'order' => 'DESC',
# y- w) W; f' v( Q4 R 'orderby' => 'date'
' b9 G" x3 q6 W& \& c2 u! t' j );' K0 R8 B; u& I- O
$query = new WP_Query($args);
+ k6 U ^% e/ s; d I% X; C if ($query->have_posts()) :# `# I- Y1 u6 z3 c
while ($query->have_posts()) : $query->the_post(); ?>
' [0 a( P. E4 o" c- O; x <div class="notice">
/ H G1 A3 x- U0 y* K5 b8 H9 V& x <h3><?php the_title(); ?></h3>6 v, S5 T9 t$ a8 ~$ L4 M& Y
<div class="notice-content"><?php the_content(); ?></div>, A! }8 }- e' g, B/ b- Y
</div>$ ~0 `& l0 M. h, p N) _! H
<?php endwhile;
3 S$ g. ?6 g( K) v# w wp_reset_postdata();# e- V- b" u+ f2 @7 j+ x
endif;
1 S! Y1 x/ Z' f3 E5 j, I ```4 m6 \" V4 k) u+ t( k2 i, q& }9 y% }
! F/ o9 W. S& F( b4 X) ~ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|