|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
/ D% w% Y0 T; y$ x/ E2 T
! f5 p$ z) v& E如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
* I: T1 K3 j# J# ?( {
' w8 x. ^/ F! ~( x$ o以下是创建自定义插件的步骤:( N) U2 C% Y; N5 d
' T" s" }7 i7 G. I
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
% c B5 X. H/ U/ H; H$ n
7 D: |2 R7 h' c/ M ```8 [! h$ a2 q3 S
<?php
; ]7 o* L2 z% w /*$ x$ C, O7 A9 V D; q
Plugin Name: Site Wide Notices Plugin$ E; N1 {1 i3 A* e2 H
Description: Adds a new custom post type for site-wide notices.
h( j: \* K v* l$ N( \$ B Version: 1.0
/ B% F) G0 J* {6 U7 W Author: Your Name
" K7 U- K4 }1 I) c. s Author URI: http://example.com
|# D& A7 c& ]7 W */
5 [5 V/ q0 d1 u, k3 F0 |1 ^5 J
4 y$ B4 G: W' h& G+ J( S- ]) ` // Add plugin code here..." d* H) q( O! ^3 P% R4 A6 L4 O
```/ `; ~# L \; a/ n r& T6 g
1 l3 ] F: C% E" D4 B5 @/ S7 X0 j
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。0 i5 F, Z, n. Q. a: G
/ {4 D7 a) Y* Q. j0 T0 I& O! G# ~7 c- z2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:7 k. S% v$ q" s9 O6 ~, p8 q& w
8 w! c/ }; P7 M# [# h/ o
```
* w/ g- G" Z: G. [- r$ r add_action('init', 'create_custom_post_type');
- i" K7 n$ T% Z+ }; W0 e function create_custom_post_type() {
0 s9 Z5 m/ I; u2 e $labels = array(3 j: c' P3 L8 a
'name' => 'Site Wide Notices',
9 H U7 |. p7 \( O1 Q7 z' u 'singular_name' => 'Site Wide Notice',3 }& T& m) S1 x; t2 k/ [$ `- u2 x- B
'add_new' => 'Add New',
4 _+ e5 {6 b j' d, l* T0 J( h& l5 K 'add_new_item' => 'Add New Site Wide Notice',
4 N0 P9 e1 Z4 X( G" m 'edit_item' => 'Edit Site Wide Notice',
- h) |% I) o! y. y! P) J* I9 B 'new_item' => 'New Site Wide Notice',! l7 W+ B. c: P) q0 R: y% ~/ I- H; F
'view_item' => 'View Site Wide Notice',
* y6 k- h) j3 A- X$ m2 X 'search_items' => 'Search Site Wide Notices',
1 D- Y2 Q$ {* s5 ~- u 'not_found' => 'No site-wide notices found',/ l" q K* a R3 E8 p7 l
'not_found_in_trash' => 'No site-wide notices found in trash'0 b8 u* E3 N% f6 M& r6 t5 i
);
# d0 F" B1 I1 r
. V0 d# p/ g* M/ a6 B $args = array($ H8 q/ }0 ]0 u p
'labels' => $labels,6 v4 Z1 s0 \8 Q7 E# M
'public' => true,+ ] f& c0 i8 E+ m6 h8 e
'has_archive' => true,, T7 K* Y' \5 M- x% ~7 }7 B
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),/ ~0 {3 x9 ~% H$ P6 \5 r
'taxonomies' => array('category', 'post_tag'),
% ~ c3 u$ c" B# F- Z& F1 ] 'menu_icon' => 'dashicons-megaphone',
1 G* T& ~! Z/ E" J& [) d% @1 J5 s 'menu_position' => 5,; J9 h6 q1 g3 G& G1 Q6 }% J6 G
'rewrite' => array('slug' => 'site-wide-notices')
1 c: G; O& f/ G0 x8 J9 Y );1 u6 p6 j0 c. A& b+ m
" i# n) b; d" ]) t register_post_type('site-wide-notices', $args);, i. U$ q8 K( |: X8 G! `
}: n' Q# F" k: h7 f. I7 E5 r0 ?" C8 |8 A
```2 p/ ?/ F% A6 g3 f: s! N2 G: S8 M
7 n; g P3 [9 W; h' p
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
& C# A( g- ^4 W1 N$ L; }: I& r! l# h6 M; A
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
' @6 [9 f& _/ x6 v/ [8 C3 M q' F; r( F7 D; r/ L
```
9 x* z" g6 Z/ x% z# w0 z! B/ _& `" v add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
- f8 x! P {" A7 ? function add_site_wide_notices_boxes() {
i/ g2 ]% G4 l add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');2 m* A$ I: J- V' X
}
, v: z O. l+ D0 b7 ?. P+ `! J* s" y
function notice_details_meta_box($post) {
# X& l P2 o3 s! D7 [7 U* x! d wp_nonce_field(basename(__FILE__), 'notices_nonce');
: R4 a# X: L5 B. I $notice_title = get_post_meta($post->ID, 'notice_title', true);
, i% X, S7 Z# y [; | $notice_content = get_post_meta($post->ID, 'notice_content', true);+ @ |8 z7 L; B5 V# K) D& n6 D
?>
) l: r5 q3 w9 I$ p& X <p>
+ W% t" T8 n, y2 w8 X( X <label for="notice-title">Notice Title</label><br>
! M5 N; D4 \3 z1 d& ]1 a( z <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"> J r: v6 B8 D: Q
</p>
( Y: s! G# t, [8 z; u/ s <p>
8 j$ z- f; d3 [ <label for="notice-content">Notice Content</label><br>
* C# P: D& m! V7 j' F4 Y% l* t <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
( V: Y0 e. m, x1 w+ s- G0 N \" { </p>
5 a" L6 m$ U% y) K <?php* [2 E' G7 P5 _) V1 l9 x. J
}9 W$ ]" v9 |6 S2 n: U
S7 P M- g" s6 P B
add_action('save_post', 'save_site_wide_notice_meta_box');) K9 ^! b3 J3 U9 F+ G
function save_site_wide_notice_meta_box($post_id) {5 v o3 T/ f9 ?- ?0 r' ] S, v+ v
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
# r# N0 Z. o6 E6 J+ `8 ]& F return;5 u. W5 y: s1 }. q! h2 S) Z2 ?2 f
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
8 f. u# [" s. \, g+ R1 w0 l; _ return;% F, G% Q; H. \& p( U) V! M
6 {, l R+ u6 Z) B) b! k, ] if (isset($_POST['notice_title'])) {
4 G: u1 l. g3 `* x( L update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));( @$ v3 S& ?! K7 x; h7 [0 n q$ r
}
% m: ]$ E* P8 n! T$ f# O if (isset($_POST['notice_content'])) {
1 P$ Q2 t' f1 z/ B! l G% o/ s update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
4 m% s# Y3 X- M. G; k }) q+ r, i- h4 Y* f
}
/ M8 F, C7 s0 s- o( Z5 a ```0 k0 g R! W4 I
2 }1 i& R* y- }, q4 b' M5 N& Q
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
! U8 v& n6 M* ~& v' n: T1 |' H l1 r7 k
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
4 v4 G, k) P' Q4 e# f3 @4 R- J" N% g! p$ ^; `; K
```; r: X" g+ M' f$ ^ x- Y
$args = array(9 W5 w# ?. F- x: N* R7 _
'post_type' => 'site-wide-notices',
8 v2 K: f6 {( I$ ^7 X2 A' k 'posts_per_page' => 3,% \: L: J4 {4 E) [) g* N- r8 X9 U
'order' => 'DESC',- C$ J$ |( V. \( G: J$ i
'orderby' => 'date'$ {8 v$ n# U! S2 O7 C9 P; G. G. t
);
: O4 j0 C$ R( ?" ` $query = new WP_Query($args);- N; q6 `3 S$ w+ i3 F
if ($query->have_posts()) :4 k) ~' k! u" S9 F0 b# }
while ($query->have_posts()) : $query->the_post(); ?>
& e2 _. p% ?& C* d2 m+ s <div class="notice">; y. d8 j, u. ]+ d' U
<h3><?php the_title(); ?></h3>: X! J7 F; J. O4 @8 K! X( g. X* I
<div class="notice-content"><?php the_content(); ?></div>; V4 ^# L! G/ B7 u8 D
</div>
! q) j3 p( w3 B! I$ @2 ^ <?php endwhile;
4 J' Q- J5 q0 M5 z6 Y7 j$ h' [ wp_reset_postdata();* v! d0 q& h2 b+ ]* B# w. X
endif;
: _' A/ Q) \% F: ?& W5 J9 j; G6 k ```0 }) Z- p% ]- t; ^7 u$ T) Y$ F
u) `" h0 n9 b; q z9 A5 B7 f8 [# N
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|