|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?: Z, k' Z+ o2 @
0 J" p& s2 p7 p* g' A* o如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
2 J+ m1 ]1 X0 P9 W- ~3 D
1 x; J, c }$ b2 g以下是创建自定义插件的步骤:: B0 |: A! p2 B( z; F
. P2 U( \ t/ p: d' h) c$ `, R8 J1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:! t/ M; M/ M$ p' X. g$ S
9 Z9 U1 Q4 k$ h! N4 E
```
7 X2 N( r) j" f5 `6 H1 m' s0 g <?php
4 [+ t7 ]! H1 @6 k) } /*
; ^4 K A" u$ Y3 t Plugin Name: Site Wide Notices Plugin
! h/ r' h) w9 {( U. c! P( U8 X Description: Adds a new custom post type for site-wide notices.
+ {, o y! \3 H/ f) x* R Version: 1.0
" b. b5 k' C7 u" e Author: Your Name
# L5 w4 W# S: m Author URI: http://example.com' ~* |! W# I; K' q9 \+ A
*/, p- y6 ]$ q$ a! k- u& D
) ]4 f$ d1 |. f K- q# i% F // Add plugin code here...
" J; b4 O0 E' Q& ` ```
" {+ z$ c+ V7 x0 ~: o, f$ @. _1 [5 C( y
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
& o! L4 ^- I8 |3 f: F& Y
3 ^/ K! r( K3 }+ T' t2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
: h6 h6 O* E" F5 ^! f' j, ~1 A! W, L1 {
```9 U7 ?3 x5 f0 ?# n8 l5 V
add_action('init', 'create_custom_post_type');! n6 c+ C+ @8 O$ Z) H2 \
function create_custom_post_type() {: l/ q+ @9 T( Y
$labels = array(
% E6 e) b9 l- g4 q' U/ M 'name' => 'Site Wide Notices',) o( j" O) q# M s
'singular_name' => 'Site Wide Notice',
. K* z6 _; w# O7 }2 n# P8 }' c- \ 'add_new' => 'Add New',
2 Y9 h& g! X- p$ e" k; e4 ? j% z 'add_new_item' => 'Add New Site Wide Notice',
/ p K4 o5 Z$ U8 M5 {& i 'edit_item' => 'Edit Site Wide Notice',
) O. }+ I$ ^% G7 v( n6 R9 |$ f+ u 'new_item' => 'New Site Wide Notice',6 L$ {; g9 g) V$ Y( g8 N/ G
'view_item' => 'View Site Wide Notice',
# A9 Q! ^4 f* L0 b; n 'search_items' => 'Search Site Wide Notices',
, {; p% m; |4 H2 p9 H. E5 i3 _4 G 'not_found' => 'No site-wide notices found',
, N- [9 C% y1 H 'not_found_in_trash' => 'No site-wide notices found in trash'
8 x9 g4 F9 C( Z; f- u: w3 ` );5 s# A! E" Z3 k6 I
2 d0 q8 {+ l! e* H6 q; J j H $args = array(
6 v: l; x, E* ^ 'labels' => $labels,+ h' Q( s' C5 m }3 Z/ t; o4 l
'public' => true,
* z0 Q" ?5 i' N+ R 'has_archive' => true,
+ N/ {9 y5 \0 z1 C0 \- e3 G 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
9 M# i+ i% Y; J% h* f 'taxonomies' => array('category', 'post_tag'),
6 d8 n/ F8 |9 s+ Y3 c1 a1 p 'menu_icon' => 'dashicons-megaphone',% l2 n! v9 r2 B) Z
'menu_position' => 5,' O. ]2 M! u! X5 Q, V
'rewrite' => array('slug' => 'site-wide-notices') g: J7 N+ p) w( Y
);
) ~' r: U/ k0 U9 O* H5 e. g* |) h1 s6 x# d1 k, u' Y* P1 o
register_post_type('site-wide-notices', $args);" T! W: ?4 _* A6 B- l9 m
}
7 u- T7 j5 G0 G4 H i" I. H! d ```
2 F8 r# b. x' W% i y8 o1 ^+ z$ T+ R" S/ @" \9 l" V
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。% ^2 U3 s9 H$ j6 h$ U& k
. s1 f% L h/ a* V& u+ ]' P3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:/ r! R0 x" \0 K, R3 E! S$ s" v& a* Q
8 p4 ~0 [: t8 o5 N ```
$ q. Y# }- t& C! @1 i add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
" {6 U& ~0 c- S5 J3 J# A2 H function add_site_wide_notices_boxes() {7 u3 f; |+ q) e+ M# ^
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');$ B& N% B0 I5 J7 i' b
}
5 Q+ E U' J$ R
0 Z, d$ @( A, B function notice_details_meta_box($post) {
: y, l1 F- H8 m wp_nonce_field(basename(__FILE__), 'notices_nonce');
/ u$ p- ^/ w, ~- o* N $notice_title = get_post_meta($post->ID, 'notice_title', true);& k7 K2 H8 S% a( ?# F4 {" _& x
$notice_content = get_post_meta($post->ID, 'notice_content', true);# N* Z; ^$ ^( x1 T% y+ h
?>( t2 J( v9 O! R# f2 ~: t+ N' z
<p>/ E, e& b6 m; O- ]) z5 D# h
<label for="notice-title">Notice Title</label><br>9 |. y c V6 D
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
6 c+ @( z V) u </p>
1 `0 S# V+ q3 S9 N <p>
8 ^! _: U* f5 L. w <label for="notice-content">Notice Content</label><br>+ [( T& \4 { Q# e2 K: k
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
. D$ a* e0 Y: P7 ^: Q1 W( p0 r3 p </p>8 q. ]. |+ a o) F3 W
<?php
% }8 A$ E% ?" [5 v: D }
- l: t$ {5 p5 |! N1 Q# W9 O
: H0 @6 w' W- @( H/ } add_action('save_post', 'save_site_wide_notice_meta_box');' b% g1 i1 S% y6 Z6 \( E
function save_site_wide_notice_meta_box($post_id) {
- v8 Y/ E4 w" x- _6 } if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))" d# i, ^" e6 M; y
return;* [( H% \: t( n L
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
, Q/ b+ P* n! L return;+ w% u& G }- @% b6 O) r( `
$ ~, D( X) z, m C9 L1 f
if (isset($_POST['notice_title'])) {, x! Z' b- A% ^" v" c
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));# T- Z) \, q' ~9 v! D
}
2 k2 R( R8 J6 s5 L6 v. A# w if (isset($_POST['notice_content'])) {! J* L. ?3 }: Y
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
8 x/ D6 O: [3 F! z0 K }
, l0 L I! h5 L6 F& @ }* @9 }; {$ O8 ^
```
5 R: F4 a! M, C+ z; r* k) x2 `' _3 y+ ^* y0 S) s9 M
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。" A$ b8 l3 D0 F& U* ~$ i: I: Z: X
; @% l" `4 w% z9 @, K4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:) I/ Q8 [* S1 X- ^1 \) E
. L9 S) B% g4 l" Y
```
3 G) ~, {7 k& A, o. y6 b $args = array(1 k! V' s) I$ y. T$ _: H' k" f- K
'post_type' => 'site-wide-notices',' z5 _2 |* x6 h& r; K, g3 Y
'posts_per_page' => 3,
0 p, t7 o; `9 o; |0 I 'order' => 'DESC',
4 p2 Z) c1 u" D- ~ 'orderby' => 'date'4 y; z2 x! j/ ^( n, T' Y2 P, N# Z
);5 | j8 B& M* s: W! o% k" e; I
$query = new WP_Query($args);
) u: R6 e, S; y) ^3 O; K if ($query->have_posts()) :; o5 ?3 a" ]. J$ M. P$ n+ E
while ($query->have_posts()) : $query->the_post(); ?>
2 M ^9 E6 X" B3 u <div class="notice">
; b3 M$ D5 Q" \; {- V <h3><?php the_title(); ?></h3>6 E% O, F7 e) b! E8 M
<div class="notice-content"><?php the_content(); ?></div>
8 f: I- Z! T9 m1 q% r/ y( @( X </div>, J9 f$ Q Y5 b% g
<?php endwhile;
' }( J; a6 a3 i& ] wp_reset_postdata();
" V' o8 O+ r! _8 {5 m4 l$ ?5 t+ n$ q endif;4 T, b t; b# b! {9 q, d
```
) \' J4 N# T! B& _, y/ M2 P; I6 Y) F
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|