|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?9 m' Y! q% e+ }5 Q1 p# ~- V
- B# R% h- |! Q2 f: ^
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
6 `6 F, }5 d; T! w B4 p# m( L& c6 ~3 T& j' l: t. [
以下是创建自定义插件的步骤:
; @! ~! t1 @& {0 l; e0 |
+ ^# q* t( L4 L* I2 Q* [: `1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
) ]% L$ ^$ l5 P9 E
7 |* i$ G9 Z/ S/ A+ Z0 l8 B ```6 a" g4 @, `/ w, m; z) {
<?php4 g2 } q0 s8 D# c; W7 x
/*
0 z0 k8 B: ~# t, `+ t8 D) T Plugin Name: Site Wide Notices Plugin
, F: K4 a( I* x( B3 _ Description: Adds a new custom post type for site-wide notices.
! ?% ?2 D7 R; P! w6 Q Version: 1.0
" X7 u' e, {3 p4 i; _. B% L Author: Your Name5 @' |6 X5 }0 B% q# _$ |
Author URI: http://example.com) P' q6 i4 Y( v6 H4 D; [- a* U4 t3 k
*/
0 L% t, _. G1 q) d7 E ~ F8 c% W0 i. b2 }% f3 R, O3 V- I
// Add plugin code here...
8 U. L, p: n, [" c% V# b ```' ]) t {: ~4 a0 i( Q8 A
4 P& q, U v, k* R 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。% ~) l! Q0 `8 [" L& z6 I8 y
2 q# N `& k1 ^' Y1 F
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
2 \- G+ U: q! w4 g
1 s6 T! Z5 I) X+ X' e2 z ```
5 g- C6 A7 d% X* r! p add_action('init', 'create_custom_post_type');/ s2 T* l0 o' p, b7 ^) E' N
function create_custom_post_type() {
+ f0 r8 |6 O6 |" i $labels = array(' R5 Y! {3 y! }6 m, X
'name' => 'Site Wide Notices',
3 O2 y& L% w5 m 'singular_name' => 'Site Wide Notice',
# e% M+ C- s. d4 A% \" w% g8 W 'add_new' => 'Add New',
( s6 M- e; {: J Y 'add_new_item' => 'Add New Site Wide Notice',/ s8 @, R3 P- ?- n; g8 |% D6 s
'edit_item' => 'Edit Site Wide Notice',4 n# d m$ H0 H1 @ W4 t" U
'new_item' => 'New Site Wide Notice',- ]' u* O; b; |% j" R6 P1 W. }, ~4 B
'view_item' => 'View Site Wide Notice',
1 Z r6 _" e6 e3 I l0 y9 O% P 'search_items' => 'Search Site Wide Notices',
2 Y/ h/ `8 g) r* y0 q 'not_found' => 'No site-wide notices found',
# P( e3 Y5 b! S `6 k 'not_found_in_trash' => 'No site-wide notices found in trash'- T: Z0 o8 V4 e) F% M p7 G
);
! l: \9 } D4 F3 \6 A+ \, x9 v }/ {. |# \# O
$args = array(* {4 F; \: s K: ^$ M
'labels' => $labels,: g/ Y# ^. I; ?8 `/ V2 Q
'public' => true,! L6 q. u9 {# k
'has_archive' => true,0 z V' P7 R- z1 ~
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),! X( f9 ?' C* k$ `
'taxonomies' => array('category', 'post_tag'),
% ?' C% T3 u7 X8 | 'menu_icon' => 'dashicons-megaphone',
2 A d( C' s0 A0 H. ]' ]/ V5 }$ j 'menu_position' => 5,0 H D$ X( E9 e% W6 j$ ?/ O" ]
'rewrite' => array('slug' => 'site-wide-notices')
1 T. Q8 S" r( W. _6 ~8 b% g0 u9 W% c );1 d9 b5 H! ]# l6 N0 j8 z6 ?
$ g0 L, ]6 n" ^* m5 j4 d$ u
register_post_type('site-wide-notices', $args);
& t) @1 W, j: n" ~: `+ l5 R }
4 r, C+ y. k9 n# u/ l0 ` ```
$ x* b+ \4 }, u0 ~$ h8 {6 O
$ A. b9 H& s1 X8 w+ u 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
% w$ }! {' Q* I) ^5 h
/ V* V/ i# g5 g3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
6 F& N4 y4 H3 i5 R% E8 S: |
# j7 _/ X1 t8 d+ I ```
# X) i6 i; z% W" R5 B& c' h5 c add_action('add_meta_boxes', 'add_site_wide_notices_boxes');7 V a' e( {# R0 e3 \/ V
function add_site_wide_notices_boxes() {
1 h- r0 X: D, v {% y4 o add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
1 t9 @! X2 A; _# O* B, I7 G1 [" \ }% U: q& r k3 i! c4 c
1 `" f7 Y& j) \% @! Q
function notice_details_meta_box($post) {3 t7 X; c. y9 M; _3 G1 P4 G
wp_nonce_field(basename(__FILE__), 'notices_nonce');' U a) P' Y1 S5 z9 Y* z
$notice_title = get_post_meta($post->ID, 'notice_title', true);3 U- K4 {9 ]3 b6 C
$notice_content = get_post_meta($post->ID, 'notice_content', true);
8 r, Q- @. k. j8 G b ?>* ?( x6 ~9 u9 d9 S( v/ x* J% y# w1 }
<p>
1 H) Z: s$ J5 T5 x+ c9 e8 _" I: N t <label for="notice-title">Notice Title</label><br>* U# r9 ^8 q8 O$ ]
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
$ b) ~- {1 c" P </p>9 e4 b8 C) E/ Y5 Z
<p>: ^9 `/ }/ U0 a: e8 v
<label for="notice-content">Notice Content</label><br>
/ _ n P' x8 ^* N2 ?7 r <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>2 X6 w) |7 V9 r- e% j" r9 w, K
</p>' ?: f- r/ N2 a! c" p( h
<?php3 Z' k' e) D6 x" H# t9 }, L1 W* N
}: i$ Y2 d4 X) k+ j* j
: ?( C8 s0 n0 p$ p0 E
add_action('save_post', 'save_site_wide_notice_meta_box');
Z" l$ D/ B7 l function save_site_wide_notice_meta_box($post_id) {* i! ?! \: Z% x
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
7 s1 X1 j0 e* P: Q3 p ?! j return;
; a1 b' W8 N5 O( k# F0 G if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
' H8 N |6 b% A# i return;! ~& o- b, Z1 L
( ]" |" o5 b5 e" T
if (isset($_POST['notice_title'])) {
5 X- k7 p/ {) ^' i8 S* _ update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));7 O+ {! V) F' V: p
}
; z0 R3 B& j, h* {4 R% l if (isset($_POST['notice_content'])) {5 x/ X/ v: S( Y v. p" @% I
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
+ W3 T2 e' `* V( ]$ \0 L, m }
; v g2 ]( q: z' S }7 A" T6 Y# }/ ~) G# E6 ^+ a8 H
```7 E6 o3 l( [% n/ C
) A w! f# R q. j5 {1 i* x9 B T
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。& i9 \, T& {7 ^4 }8 C% P
7 |' w5 f Z4 y" v) H4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
# ]9 B$ B$ G# r% y/ h5 D" k5 E
! i+ M. r5 Z! Q0 r5 ?6 y2 [ ```
; u' @: r/ \9 M $args = array(0 M9 l. B8 A. X! G8 \" p5 H
'post_type' => 'site-wide-notices',
- P7 N& D6 [: x" v$ Y5 i 'posts_per_page' => 3,
6 _& u: @; Z+ j2 z' M. ?5 M' o+ L 'order' => 'DESC',0 q4 M1 o& B [4 |( i7 j
'orderby' => 'date' Z# G: M' b0 {# S
);8 V; u) ~0 C( x, B2 B' }% Y
$query = new WP_Query($args);7 m) c- E+ r6 a( m2 U# D" @7 z
if ($query->have_posts()) :# K1 X+ K3 F$ I S) U' t$ g0 m
while ($query->have_posts()) : $query->the_post(); ?>
( \3 w& [) U x. r$ E: j+ v; s6 s; U% G <div class="notice">
0 ~& y. k4 O% ^& Q( H% g <h3><?php the_title(); ?></h3>
2 L/ [8 t7 p" ]0 Y& @ <div class="notice-content"><?php the_content(); ?></div>8 S3 U" z0 _# R/ y* |( M
</div>
$ W! Q8 I( ]5 M0 |, w+ k! M' J! D* s" k <?php endwhile;
2 q# R% ^5 W' F- t6 ?$ v/ ` wp_reset_postdata();
+ q, }1 ^4 a( O h2 w endif;
. I4 ^: h( Q# Z5 I0 S ```, a! d }) s) i+ }" W7 V9 P( `
* h( X. O! y& V; }4 F+ b! p$ _ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|