|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
2 | t6 q" J6 B* [1 j
, d" p' S5 r( B" U1 N$ }如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
$ |1 } r; p* D4 A. V
9 H7 P1 b$ C) H4 E8 ]9 C. X8 t2 g) i; y以下是创建自定义插件的步骤:
0 d4 w, ~& \$ P# M3 W0 e) G1 s* R2 a) ]- Q4 v5 V
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
; E& ]1 N$ g4 @- \# F8 @- u; E- J S
```% S3 Q. U6 B" }. o' O
<?php7 j- G) N1 ]; X7 K) M. {. A2 }
/*) R" a8 q! V& g/ V/ F6 B- d6 q
Plugin Name: Site Wide Notices Plugin
# A4 U/ X, ?$ i Description: Adds a new custom post type for site-wide notices. }5 j2 W( N1 ^' k+ h6 j
Version: 1.0; q$ i! |5 d0 y0 N
Author: Your Name
: y6 A: }' {8 R4 a) F( c7 ]$ h Author URI: http://example.com
6 o; X0 e$ z: e! b6 t: F */
4 r! E9 y4 E r4 z+ ?0 U3 |& Q9 X; ^( ~7 Z
// Add plugin code here...% g+ g8 P* I2 C- l0 |
```
. e* h5 O% n/ E
& o9 Q; V& g" t+ y) U' S 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。4 K+ e2 }9 Y6 H3 t, G7 }: ?
- w! d7 s, T: }6 F8 ?/ D2 o2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:/ Q& ]. Z0 [, v
3 V7 m& m7 R2 X/ @- k) n9 @ ```
7 n1 d- I) Q& z6 ~ add_action('init', 'create_custom_post_type');2 R8 k0 W& S* y. O; D" b" O* ?: `
function create_custom_post_type() {2 S: T. f9 [( ]' C0 R( v; X
$labels = array(
o# ]" J9 x: S6 k6 P% y6 \. u& k 'name' => 'Site Wide Notices',
7 I* S- D5 o7 D3 [ 'singular_name' => 'Site Wide Notice',
9 T8 r7 g# A$ a1 t0 y 'add_new' => 'Add New',
j# Q3 F6 \% X! `0 s& j8 v 'add_new_item' => 'Add New Site Wide Notice'," {4 p7 \3 z# E' Y i
'edit_item' => 'Edit Site Wide Notice',
& B5 W2 `+ M/ | 'new_item' => 'New Site Wide Notice',
& v& p+ j+ O4 s2 D; O o$ G 'view_item' => 'View Site Wide Notice',
+ ?, s4 Q, Y' s, r, t, t 'search_items' => 'Search Site Wide Notices',, i+ m9 w: U9 o
'not_found' => 'No site-wide notices found',0 l0 G8 U# Y( d5 h: J7 k
'not_found_in_trash' => 'No site-wide notices found in trash'
7 d9 F3 j6 D) \8 x6 q6 k+ D/ o );
% Z, S0 l/ i0 B& t' m% }, N2 g
) d$ s" l8 R8 q! ~1 l& N $args = array(3 @ x0 G9 j/ ]1 t) l2 f
'labels' => $labels,$ X: r0 w W" e
'public' => true,
1 }" F- @: s5 f8 b- E! S 'has_archive' => true,
. ?0 F, E* r+ J, S- G! T 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),, z6 [% N$ o. e4 w7 T9 o1 ~
'taxonomies' => array('category', 'post_tag'),
0 n3 a- f. a5 |; s# m5 K3 u( q 'menu_icon' => 'dashicons-megaphone'," y8 E; \) I+ J" p" g
'menu_position' => 5,
" x6 R: P7 [" \+ u0 ] 'rewrite' => array('slug' => 'site-wide-notices')
; e3 g; g: @9 r+ L( R- R- {1 H );
+ s8 S: |/ W- @- g- @
, K: {# N* X3 `% G register_post_type('site-wide-notices', $args);" A( Q I2 u2 Q: q
}, F( I V6 ?- i
```: I- R4 q5 G( }- Z; t% X
# b* ^3 t# ~# s0 a. q S5 s
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
v4 n% L7 M& N+ L$ c& o0 Q/ M2 K0 @$ E5 x+ @9 f
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
' r$ X; g% L, N( f1 w- R- K2 E1 M2 W9 t/ w2 B# P% p
```
; t, d7 c, ]. f add_action('add_meta_boxes', 'add_site_wide_notices_boxes');# T# K+ Y ^% K& |
function add_site_wide_notices_boxes() {4 B2 U3 B l6 E" U- `
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');& B) h6 }8 n, b4 U- g
}
6 @0 o+ h( l; n( A7 w8 ?, T& G6 J- Z/ Y" n& E+ A
function notice_details_meta_box($post) {% ^: D3 E' W" Q/ a
wp_nonce_field(basename(__FILE__), 'notices_nonce');) r P8 w+ e* b
$notice_title = get_post_meta($post->ID, 'notice_title', true);# e5 W* m! S6 e+ V
$notice_content = get_post_meta($post->ID, 'notice_content', true);
5 ]) d" e# f6 D+ p8 w1 k |' x" p ?>
, P1 t; R; n$ F <p>
( t. g4 Q: Y& R, k, X7 @ <label for="notice-title">Notice Title</label><br>
4 ^2 a: a$ X9 Q; F' m <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">7 l, v! y9 O/ C3 [" @0 L
</p>- J' h ~1 [5 c) N; E2 k8 ?1 K
<p>
' Y$ i, x' u9 v <label for="notice-content">Notice Content</label><br>; ^9 |, c0 {6 g' ?' f
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
" h) I8 [0 H2 H- E2 x5 ~ </p>3 }% k6 o- B2 `
<?php
( |7 X! z j- Z' V3 {0 n5 E }' R1 q; K3 s# [% A( K7 i
9 [' f0 @" y" c- g, i
add_action('save_post', 'save_site_wide_notice_meta_box');2 N" M0 b) q- L! a- I
function save_site_wide_notice_meta_box($post_id) {6 T* `7 C" y9 ]
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
2 x7 E6 q/ C: r4 \- k6 A4 E( ^ return;
# b" W X2 ^! `0 l8 p) `* x7 l if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)1 s+ b' G- {8 L0 V
return;" K. Y! R! ^' N2 j) x8 k; |
+ h$ j- U& H" w7 |; i' s* x% n
if (isset($_POST['notice_title'])) {
: H- o. D; G5 j4 k+ r3 E update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) g9 `) I& }" G- y) T0 L
}0 v7 p/ a' W3 S' w( ]. Y
if (isset($_POST['notice_content'])) {
; m8 M3 P+ R/ v6 z( y4 b# R update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
( c8 R/ p. |3 j& j0 D8 k }
$ K: |+ }0 l4 u3 j1 b }
! J6 Y, M7 l9 z5 S0 l ```/ j1 Z1 _, E* S) t2 w+ d
. L6 n {. L0 a( `5 m$ y
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。0 X# s; a3 e1 W7 S j( n
' f6 Q+ |/ C* m. `) N* \4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:% B0 Z5 x1 p7 Z5 E. T: b
% F. O" y; W& N5 X ```8 i' g6 i# j1 V/ F" |# }+ M
$args = array(
, r" a% [+ V' M9 M i1 g/ j N: v! {/ J 'post_type' => 'site-wide-notices',
( I& R6 f0 C0 S7 H* p5 E2 d2 a 'posts_per_page' => 3," J- B1 q+ C2 G6 Q7 \1 Y/ ~' Y
'order' => 'DESC',9 s2 k$ @4 u/ L. b, J) ^% [. G
'orderby' => 'date'8 n$ r3 }4 o7 H. b
);5 Z& \( W p) g9 D5 X4 P8 ~$ O4 ~
$query = new WP_Query($args);
* a2 O0 l% r1 w4 I, M5 E if ($query->have_posts()) :2 E2 F* `) y S2 m. C
while ($query->have_posts()) : $query->the_post(); ?>0 R# Q$ y8 e" V7 P, M0 J
<div class="notice">& G: I1 A+ C9 B; d) ?& A
<h3><?php the_title(); ?></h3>
- C4 V/ a( y, H2 V3 s& U <div class="notice-content"><?php the_content(); ?></div>* x. k# G, V: C/ _ w; d3 i; Q. Q
</div>
. N" w) G: d+ L* f* D4 f4 I2 a: n# B <?php endwhile;
0 I A( y) }. w1 X$ r* G wp_reset_postdata();
) y8 b" ], y' c9 o& `/ n endif;
2 X1 R1 M1 a* B4 [ ```
/ U M0 m+ _) ~7 U% O+ j$ Q: z/ S8 u7 a1 Q/ e: D+ [
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|