|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
3 g; |# F; V( p1 |7 `8 D3 L7 V$ _$ }. A7 [* x( p* K0 \/ ]
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。0 w2 T% _ `6 v3 Z. P5 M" ?, C9 m
, g6 C. {' U( E- z; l
以下是创建自定义插件的步骤:
& e. Y: w d5 q3 Q4 c
' _% @4 i" j" {* y+ }9 U1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:7 |4 v) p1 R2 T, V. j
& [( ]' b6 Q! x8 B# w4 S ```
+ o( C, n6 {$ x <?php
9 N4 q; c1 N5 T /* [. J* M0 U' |7 ?! m, n
Plugin Name: Site Wide Notices Plugin
( u: Y/ t# `0 z6 C8 A Description: Adds a new custom post type for site-wide notices.2 i1 `6 E2 f2 g4 N5 b L- c
Version: 1.08 T& J, L7 \ L/ f" |4 H( @) p9 m
Author: Your Name
G& v: w- \; q% y Author URI: http://example.com
+ L+ w0 S9 L8 W2 j/ G7 ] P */
1 d' R! s% Y2 ^% b
8 ]& F+ e+ A9 R$ Y // Add plugin code here...
4 k" \5 Z# d8 f ```1 J0 B, Q/ ]1 c+ }( s7 U
5 r: a/ P8 l0 A7 {1 R) E
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
4 A! \ V z2 [ U
2 ?6 y% _. b f" ]7 I2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
, K+ ~( H0 _% n( Q# q4 `/ D6 v
) b4 c- ` \( t9 ?' w w' c* F; D ```
$ J" d+ p- N: Z2 s5 n9 o add_action('init', 'create_custom_post_type');
3 ]' P1 B8 o H# _6 }$ a- L function create_custom_post_type() {
$ k9 F, g" j4 y# ]9 Y7 O. s $labels = array(
! R, r P8 l; A( V0 Z 'name' => 'Site Wide Notices',: }( F# B: i5 R3 B v9 V
'singular_name' => 'Site Wide Notice',
* K2 C9 _# [* g6 _- l. e0 ]& B. X 'add_new' => 'Add New',
1 _1 j, u- L. d 'add_new_item' => 'Add New Site Wide Notice',
) f$ w0 A' ~ A8 I 'edit_item' => 'Edit Site Wide Notice',* c4 I |. E) K" N$ J- k& n
'new_item' => 'New Site Wide Notice',
) ]5 p j( W) x 'view_item' => 'View Site Wide Notice',
' B: _! k0 K. m0 a 'search_items' => 'Search Site Wide Notices',
, X( M' t) w! j2 I5 H* ? 'not_found' => 'No site-wide notices found',
4 B0 z4 r: Y7 Y* j0 s' N& f: [ 'not_found_in_trash' => 'No site-wide notices found in trash'- w% b$ h8 @5 z2 o
);
% A6 a1 `$ O8 v8 v W" @- B$ {5 l+ f' a
$args = array(! M h( a" Y* N# |! a" E3 C* m {
'labels' => $labels,
7 J$ ?" \6 `( |) ]% B) I 'public' => true, {- l% f1 ?( ~/ l
'has_archive' => true,
: W/ U. e) d, H6 E 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
: E0 v o; l, i2 J& o9 k+ n% L! e 'taxonomies' => array('category', 'post_tag'),
& F! a# e- L1 o3 [ 'menu_icon' => 'dashicons-megaphone'," v. ^8 E3 e6 e4 ^3 T
'menu_position' => 5,: [; s Z# D: T. d5 t
'rewrite' => array('slug' => 'site-wide-notices')# |6 J. X! ~6 p, K% d
);
& v7 T' S; m/ V6 ~7 P$ K/ o# h# j
; j! \, i7 x$ m register_post_type('site-wide-notices', $args);7 v" M5 V! r7 M. _/ q" O- y9 L
}1 g; O; e j4 N+ }
```7 T/ I! o/ F; p
5 X( s, `9 A1 Z5 p) @ 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
. Z7 H, n, r2 g* G2 i9 \
: S! G! n c4 k9 E3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:" x7 |, C8 m8 R5 u& F5 \) c2 a. \
/ Y0 S; @ _/ L( g6 ~4 Q" o& k
```6 D! [/ Y) k" v8 w
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');) |( r3 T, o _( v- d
function add_site_wide_notices_boxes() {& Z: |6 K. f) }/ W7 M& c- S P' j
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
) I$ l0 A, p5 T, s7 p9 Y }% K) c3 ?4 Y: |+ `3 a
6 m. i+ T) X/ S4 z function notice_details_meta_box($post) {' t3 x1 b0 ?! g8 D1 c% c f% f
wp_nonce_field(basename(__FILE__), 'notices_nonce');* \/ _) X5 E+ ~
$notice_title = get_post_meta($post->ID, 'notice_title', true);) X# B! e) l8 @' q4 E2 m0 l
$notice_content = get_post_meta($post->ID, 'notice_content', true);2 d: `4 s0 V! [7 f
?>
4 ^& p" N4 K: z. H' m <p>
7 k! n! M- d! A6 s' ~ <label for="notice-title">Notice Title</label><br>
% s, U& S& }5 `4 v) T1 B3 p <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
. M8 C, b( f- {. L. B, p/ M </p>
7 `# a& c" m% E3 D9 y <p>$ S! M* ]% p' h0 w$ _
<label for="notice-content">Notice Content</label><br>/ Y- M2 s+ ~8 q B
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>, g. @- Q3 B1 ?$ y L
</p>
. V, N' b& k3 n) c3 S7 | <?php d8 `" ~- m" d. o
}
6 I# x2 `/ Q- Z: `; ~/ v5 X* P8 B* Y$ J" |: I3 \
add_action('save_post', 'save_site_wide_notice_meta_box');
9 W2 l( R' @* r" {3 f0 E/ T function save_site_wide_notice_meta_box($post_id) {2 D+ @8 J# W/ U8 F. L p( D
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
. T5 w5 {' ]4 ? return;
" h% u" D& T/ w, f' ^/ A7 V if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)4 o3 f; a0 L, f1 r" K3 A
return;
( p. {( n6 L( I9 |, l: Y8 a% S5 s# ~* h3 @' f S( H
if (isset($_POST['notice_title'])) {
: D7 _0 s, w2 d( E, i3 p update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
$ y: V+ f' ], f2 k1 b! }8 n8 n* _/ _ }# G8 C' R# C: T5 E3 z
if (isset($_POST['notice_content'])) {
, t8 U% {" K( A update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
, U/ i* d5 _; O$ i5 g& k2 W, l }
' e! H% m. b) W- N6 R1 d! @4 c" B! N* v$ F }, t* b, f2 a( e% N
```
; n' F5 z, _$ I7 a$ R# p% ^8 Z" c' \/ `
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
4 y) f* e% J: I* d6 f* U ?% h0 S( I6 e
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:* ?; ^+ K, u. B- b
4 e2 x* r+ o2 ], t( [
```
/ z8 `# v& H' F: q& m' X* [4 h $args = array(& Y& k5 o9 S( s8 }
'post_type' => 'site-wide-notices',
9 q2 s+ w/ v: q4 d% a 'posts_per_page' => 3,- y2 U) P+ U3 U5 l5 f
'order' => 'DESC',
c8 H3 B! q N4 r9 B3 p 'orderby' => 'date'
* I6 M g& f; X7 G8 ?# | );
& _% k7 z8 B! g# H3 H/ l $query = new WP_Query($args);* E$ L9 N O# q& c: Y, d) S
if ($query->have_posts()) :
) A* ?0 ?2 N& r/ s$ R1 R1 ?4 x: P while ($query->have_posts()) : $query->the_post(); ?>
+ S) f9 E: d5 P, `5 i <div class="notice">* X; A& |. A" t" i
<h3><?php the_title(); ?></h3>( Q: C% l: S5 F8 @) o1 X
<div class="notice-content"><?php the_content(); ?></div>8 M7 I) K+ ~! j8 C. X, s4 g
</div>
: o7 I/ w: K6 ~: N! x$ b <?php endwhile;2 \' K; y" e) x4 X7 n$ T" l
wp_reset_postdata();6 {+ k; S7 s* I% O5 w, W8 c
endif;7 h9 I8 _% q7 n4 A2 I3 r
```6 i% `- a! m+ ~1 ~, f% Y% r2 w$ I
4 F+ a4 D/ O- q2 [; z7 A
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|