|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?: ~1 b9 \. [5 N/ x% O
3 j* _) x* R" L; M1 i
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。0 j L: l6 {7 U' G/ b6 X
$ M. \* @* K% e1 S. |
以下是创建自定义插件的步骤:
( J7 n. R6 x! j/ }3 {5 [# f% D3 L9 T" f
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:# ?& P1 K3 r9 q' e
* j1 W5 i$ e# g, y
```, j; ~. S/ ~ w) _5 ^0 e! q
<?php( {% k4 U4 i2 ~0 z, }( {8 x/ h
/*
0 c# @/ Q4 S. t: v R Plugin Name: Site Wide Notices Plugin! K9 t9 `# w, h$ }, f
Description: Adds a new custom post type for site-wide notices.
! ^2 f7 b# \7 n3 R" J) T Version: 1.07 o: a& @% T( P/ N' N! j: Q4 G) X
Author: Your Name1 X0 e3 Z/ ]# a* y ?
Author URI: http://example.com
' y4 P1 |2 c* t */
2 J& d- K8 @3 ]3 ]. K
$ K: B! L) }% j# t4 X // Add plugin code here...
. P) t- L) G" o& B8 q ```8 w. p6 x9 A: t3 J1 p# I" b# F* |5 |
7 R" \: B1 [- X: h; x( }/ P6 t 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。% ^$ k; X, g) @# m, r( n+ n$ z0 T; N
. H5 l% M$ l+ Q* B' f) m
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:% n' z8 e8 D! ?! d H' ^
" o9 C/ ?* s6 Z0 \' o0 E ```
U8 ` E6 K" N. w& Y# L1 |0 e' ?4 R add_action('init', 'create_custom_post_type');, H( J0 @4 W, ~" D, v6 }: b. n. X
function create_custom_post_type() {$ o" F8 g ^+ z1 B
$labels = array(
. I$ ^' Q9 ^+ p7 }* q, ~ 'name' => 'Site Wide Notices',
6 y; |3 ?7 X; [ B 'singular_name' => 'Site Wide Notice'," F& }, J' d+ c* c# G, u7 X* C# T
'add_new' => 'Add New',) t6 V: R3 R9 b9 t
'add_new_item' => 'Add New Site Wide Notice',5 }0 t$ E. K, }$ S
'edit_item' => 'Edit Site Wide Notice',3 u3 f" T+ h, a1 {7 u; g5 K
'new_item' => 'New Site Wide Notice',7 O/ M" e$ _! c( j( O' ?
'view_item' => 'View Site Wide Notice',
$ ~4 [4 } `/ l2 K 'search_items' => 'Search Site Wide Notices',
# `' v }6 ~1 x+ a- G 'not_found' => 'No site-wide notices found',
1 J. W4 Y4 r+ y( Y 'not_found_in_trash' => 'No site-wide notices found in trash'
/ z9 [! T/ ]' P3 a, \ );' e) r- ~8 v/ p! M
9 b3 }( [. B! M5 @; v I& p. ]
$args = array(7 W" k j( W- n8 i. [0 B- T
'labels' => $labels,1 G' X6 i) G1 E1 q) v
'public' => true,/ R" F) h, C# _" d
'has_archive' => true,
6 S3 i. J4 P- U+ V+ m- i% h! [ 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),. s: M" G2 j( X, {3 u1 n" f5 \
'taxonomies' => array('category', 'post_tag'),3 S1 p: g" }& E% h9 Q$ X
'menu_icon' => 'dashicons-megaphone',7 V9 y* M- Y$ z- v/ k3 {, V
'menu_position' => 5,
& U2 q+ O$ R& ], v4 n 'rewrite' => array('slug' => 'site-wide-notices')7 h- A; I/ c1 W2 F$ m* V3 N7 y
);
& s+ M1 a/ W, h1 ~ r: V
) i% h& {4 U- K register_post_type('site-wide-notices', $args);
& f. ^- v& P. h7 C+ b }; v9 h$ G3 L( [4 e' I# R2 S
```
& ^9 J) X) b1 G. p- P
' p3 `& N" Z( y" F: ^ 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。$ \3 B; Z: O4 v! O8 V; [
( d# j( F( }' i8 z
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
' l ~; ]8 ~8 A7 H& { [7 _1 k3 f
```
0 B% Q" d! Z, C+ @% o) C add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
1 E3 y, P5 b2 ]8 g function add_site_wide_notices_boxes() {
+ x& `3 I$ t; c+ L$ D add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');: W4 e9 D6 C; s, |3 q
}
6 z. m+ [5 p) ~* W
* M. a: D7 T5 \; f4 I$ t$ S; l function notice_details_meta_box($post) {1 D F. u, ^- X1 \. q
wp_nonce_field(basename(__FILE__), 'notices_nonce');. Y% Y, n$ r0 e" e0 |
$notice_title = get_post_meta($post->ID, 'notice_title', true);
( k; [$ g% I" [ $notice_content = get_post_meta($post->ID, 'notice_content', true);& F2 D$ z% ?) N2 N5 {2 A
?>
1 M' \" r/ P: i2 i7 q <p>
: D7 L3 z# Z, @6 ^# E <label for="notice-title">Notice Title</label><br>
. z- Q O( I4 a/ z: P1 ?/ G2 J/ M <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
: T2 y6 [4 Q4 @7 \ </p>
: j5 Y. `- Z5 d* x <p>/ r0 [# \$ n6 I! a( t6 k
<label for="notice-content">Notice Content</label><br>7 V7 B5 @; A* q9 g
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
( Q. P, a% m# L9 L) d" x8 D </p>
! g) @1 ^1 X4 m% C <?php" q) a* I1 F: q1 |! Q, D* m
}
7 n! Q- A) t. K5 d% v) G7 k1 G
$ F8 l! s8 l+ A8 _0 S" b# n3 w add_action('save_post', 'save_site_wide_notice_meta_box');; m7 Q7 F0 a# v# I0 t( I& g6 D
function save_site_wide_notice_meta_box($post_id) {
: H& Z! W; P% r4 a if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
/ D& X. |# `6 Y! {* v# G6 r return;7 n/ J1 G9 v( r+ R" S
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
% t/ m2 `- g; q' G return;, z$ \) q& w) @
5 L! R% b+ Q6 u! o if (isset($_POST['notice_title'])) {
2 c& @4 e% V: ~8 v2 o1 F update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
) {. r+ g* U. b- t4 N }- I/ z$ [. b# ?; ?; Z2 u7 i% \0 B
if (isset($_POST['notice_content'])) {! M, C; P! j+ j" @0 ]2 A) ^8 ~0 J$ Q: f
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
+ ?- w" J. `% G }7 _' }/ ?" }8 t3 {6 ~' p9 \
}: @/ n6 R/ T5 F% D
```- \2 V# x$ b( D! ?3 _* h$ M! g
$ U+ i0 J2 X; b. N* _, O9 Z 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
. v5 T* v: C# Y1 v* Z, R# J4 \( `6 `' E; F) K* J
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:& J7 @. y: W' m$ U2 l
: T$ Y4 |4 d1 c6 r S; B6 ?* l
```
* H* d; G4 a" w% @+ `3 S& ^$ x $args = array(6 H( R. h( Q6 T4 f" R$ h6 W+ x1 w
'post_type' => 'site-wide-notices',7 b7 }/ n y: W6 E8 I# ?
'posts_per_page' => 3,9 @& {; b) }# H4 y
'order' => 'DESC',/ A1 i" o5 ^7 g
'orderby' => 'date'
& V) U; j( `1 \/ ^: s3 r+ j* L4 V: z1 p );6 S: {! Q, q6 }/ i7 t2 ]) T
$query = new WP_Query($args);
( S& r' ^9 _2 S& w8 q! j if ($query->have_posts()) :; [7 i1 V6 x) p7 [' O8 E
while ($query->have_posts()) : $query->the_post(); ?>
3 R8 b4 ]" y" b6 U( J9 E8 F+ F <div class="notice">
6 U3 n' ~$ Q2 z6 h! h, M7 A; ?. W <h3><?php the_title(); ?></h3>8 F' d" m3 A1 d# d1 X; V, S
<div class="notice-content"><?php the_content(); ?></div>
+ L+ l+ y1 t# U: d0 v3 r </div>6 Z% O& X) ?6 ^2 e
<?php endwhile;
+ I/ M. _. e. O3 m7 _! z, _0 J4 E wp_reset_postdata();
3 T! k* ?# J9 v3 s2 |9 [ endif; }) v6 J. x- A1 q- L2 l5 B
```
7 T/ ?# g; I5 H1 d9 K
6 T. U$ m r/ Q& z/ T+ l8 E 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|