|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
' s) x* \" y+ J i: H' L5 ?5 \) T7 [' V2 _. \0 d$ @ }+ s* I
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
! }; m( B' s7 P) |( j
) P/ x- `' [9 B6 u6 I以下是创建自定义插件的步骤:; p6 p, [$ @3 Y
- M1 J3 u% E9 Q/ k' @; R3 C1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:9 l2 x# w8 d8 d( p7 L: V
0 g. a! G4 z S+ X. e7 J+ | ```! ]) {$ p+ a9 u' c& Y8 t
<?php
8 v- }( P2 }! q4 {7 P" V /*
4 j7 M# d. `' x e3 ^8 k! O Plugin Name: Site Wide Notices Plugin) e4 r& o# [, A8 v8 Q& t5 J7 C
Description: Adds a new custom post type for site-wide notices.
5 {: G8 V: o7 z# M$ W* |) C Version: 1.0
& ], M8 w1 R: Z+ n5 L3 g Author: Your Name* _+ @+ f( a5 f" \; }, F
Author URI: http://example.com+ B- _+ K4 D4 p. n
*/9 a; K1 i5 \3 L. j
* w% l; l/ m1 s; d; q# Y // Add plugin code here...3 P, c0 Z3 n+ o& I$ I0 k# K: U
```
7 g# M( S) p! _. ^
+ h! X; p' O% a' \: H" N/ i* K5 d 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
% R0 A) i1 X1 L8 F9 Q4 V7 x g" t* l: `* |. A! D% i
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
. r$ R2 y+ Z2 B! _$ i+ [0 N/ ?- _9 e) [/ Y0 R, p4 [( d
```
9 f! r% @& }( D, L5 T1 |2 a add_action('init', 'create_custom_post_type');" W# r# D2 J3 r' b P4 \
function create_custom_post_type() {- P4 M2 u: t/ F. f1 R' C
$labels = array(5 I1 u- T, u- e/ K. _5 m
'name' => 'Site Wide Notices',
5 P# r$ E4 L! C4 D7 [ 'singular_name' => 'Site Wide Notice',/ b: B. k1 K2 U, b* N
'add_new' => 'Add New',$ j/ c! L( G+ c/ h
'add_new_item' => 'Add New Site Wide Notice',2 c( h8 @. t/ a r, M
'edit_item' => 'Edit Site Wide Notice',/ }9 r j$ q3 ^5 H: d9 r
'new_item' => 'New Site Wide Notice',
& e0 E( ]4 P% _8 g 'view_item' => 'View Site Wide Notice',
3 n& m v( S0 P% X 'search_items' => 'Search Site Wide Notices',
6 B: F" P9 ?. r 'not_found' => 'No site-wide notices found',
4 b/ j6 g; N( z# T- u5 V 'not_found_in_trash' => 'No site-wide notices found in trash'
/ H; U O% S$ X- q( ~% s& ? );: y3 Q4 Y1 x. ?* f6 x
: b: K6 y8 @2 v5 P
$args = array(
& y$ ?5 u8 B' D( ?, q4 G 'labels' => $labels,
0 Y, P0 e; q1 }$ U9 i" X 'public' => true,
5 }9 x# I8 y) W$ S3 P 'has_archive' => true,
& ~# a5 i; W: {0 S' ] 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),! t) Q2 V4 r) ]0 c6 Z% s. H2 t6 q
'taxonomies' => array('category', 'post_tag'),0 h$ y. M3 e4 G
'menu_icon' => 'dashicons-megaphone',
6 i+ U1 O' H* f4 x" R/ T 'menu_position' => 5,
/ K% ~/ S* i! v 'rewrite' => array('slug' => 'site-wide-notices')
H- I' ]! s' E: b0 V& S );- G5 k5 X! v; a7 d! o
! Y" a- U$ p- G+ D u( Q( m( O register_post_type('site-wide-notices', $args);8 Z8 _1 e- T+ m
}
2 u5 q3 q3 M& b+ h ```2 g) B( ]. N; w5 U. b! ^! ]
7 E$ Q4 E# Y2 i% H' T+ v, D
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
) p5 Z- m! }8 I* W6 H" e9 Y* N& ?6 `& s
; [4 V0 q) \" c) f7 ^' g) A' d5 J3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
% v; i* [+ X5 ?" o. L( n7 Q
$ { @! `8 L" ?, t/ _ ```
# D: s7 K$ M& O: |* X a' A add_action('add_meta_boxes', 'add_site_wide_notices_boxes');: f( A; j1 g. `- t7 j7 }7 i
function add_site_wide_notices_boxes() { R8 P. g; z# R
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
5 q) B5 k" A' x* B9 ~. { }% M* p. }% n. E8 [
) z/ P* [6 p/ [. ~ function notice_details_meta_box($post) {8 p( n% a8 _, S
wp_nonce_field(basename(__FILE__), 'notices_nonce'); A4 E/ X6 x: Q( \5 H
$notice_title = get_post_meta($post->ID, 'notice_title', true);+ M% I3 e% J5 x
$notice_content = get_post_meta($post->ID, 'notice_content', true);
2 D" O: C1 {8 j0 ? ?> j. v* o1 q! L' h) m
<p>
- c, G: e9 n; c F A# u9 h% L <label for="notice-title">Notice Title</label><br>% b/ V; C1 _# t7 M3 p3 c
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
+ S1 o6 v# w- D% X. @ </p>/ f# M. [/ a J k
<p>
6 r( _7 R4 \( ? <label for="notice-content">Notice Content</label><br>. ^% i( R3 V$ J
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?># ^) k9 }( l! g6 m' e r, W
</p>
- [5 _/ L% b3 P# n/ U. U <?php
. ]1 w: U" T5 J& x( ` }
3 \) o% U* `0 i' Q: [6 {+ A, L- h) {9 W* g" q; v
add_action('save_post', 'save_site_wide_notice_meta_box');
$ m' L) b I/ m function save_site_wide_notice_meta_box($post_id) {; t# K; z. B- i P4 c: M. B
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
. X1 m, s+ W, p6 e return;
1 t% w# K$ W# b if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE). e% z% x+ d) p& s
return;0 X! e1 Y" d# K" N! P
1 ]+ Q, y. ]" k- C# o: J# z+ p if (isset($_POST['notice_title'])) {
8 Z1 j- }$ w8 n update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));- O9 ~5 f3 g5 \1 B$ e- u
}
6 t! _% y. o/ C! x/ @3 Y if (isset($_POST['notice_content'])) {( |% @9 M; g7 v3 P& Y3 L' P+ @
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));! R, N7 Y) f: V6 p
}# J9 q3 _0 O5 p- p% O5 E W: H
}
8 D& v" y8 m$ [7 ~2 t+ ~* ]1 B ```/ i- \5 |) m J T4 f# d2 m: T: r
9 e6 C, `4 i& C* S
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。7 w/ n* r5 G) v2 E
, ?4 {$ Y. M; [
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
- U( z ^$ Z, N x( [) s
& l v) ^0 I* _+ O6 J" B ```0 A, @% {5 b) f% Q" k" P$ N" {/ g
$args = array(* C' y" p w, _, A, v" W
'post_type' => 'site-wide-notices',
: U/ A3 E6 A. `* V/ u6 d 'posts_per_page' => 3,
$ g; a, t/ d4 O 'order' => 'DESC',, F, K/ x4 v) f0 I3 i
'orderby' => 'date'1 q/ l: ~! e1 y! O2 \6 d
);
) v* D6 G- A, }- U0 o6 S( @9 q $query = new WP_Query($args);# ~# O" d. e- F- w
if ($query->have_posts()) :
8 N) ^! P) U0 Z( Z- p while ($query->have_posts()) : $query->the_post(); ?>7 V% @( p* q6 p: }1 K2 P
<div class="notice">
5 ]: I( s- h8 F( ?/ Y9 Z <h3><?php the_title(); ?></h3>
# V* |1 v! P* t3 K0 ~ <div class="notice-content"><?php the_content(); ?></div>$ i( b% j" X. A2 o$ z
</div>
+ L `- |4 k" U8 e" X1 W <?php endwhile;
+ b8 Y, q. v n7 A2 l wp_reset_postdata();" M2 Y* Q) M$ o9 b' P, A
endif;
, e: p& ?5 u3 `" V ```
& L' g/ Z2 [0 ?
9 \% n# ]" O* w5 M 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|