|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
' r6 o% U# S: F: Y: s$ L
+ G# Q" n0 Z' m, R. N5 d如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。! P( b6 Q6 D8 R4 ~! F1 @/ J
. V9 J. s* k- h以下是创建自定义插件的步骤:
3 _7 ~7 y( ~" a5 } ^; i$ [% C' T& d
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
0 H6 z$ G. F* U: u, k/ N
/ V" w( l* z- U, R& s( | g ```: i# f9 l# M% L1 I4 \+ Z) |: Y
<?php
" B4 |1 P1 a8 W /*3 a7 G! q. U6 B+ r# r) L% F4 [
Plugin Name: Site Wide Notices Plugin
( a) D* o' p. e& l Description: Adds a new custom post type for site-wide notices." I9 i! h* r. m9 J K# J
Version: 1.0- @6 H- T2 L( N2 c! i9 F- P% n
Author: Your Name/ H0 Z7 K' ^( t* j
Author URI: http://example.com
1 Q- {' a2 U/ e3 I7 g% x8 l, ` */# ~0 A( [) p5 p0 D5 R, T' J6 }' l
4 X" ^5 j: ^* H V( _5 }
// Add plugin code here...% h* O% w9 J! n$ z) m, q+ z
```
4 Z2 {4 o' v) H/ X# y& r* A" e. G7 g
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。; [5 H/ y( i# r4 g5 I
7 q7 O% s4 n' E# S3 c
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:' _ d6 U! E% E: ]
( K- |/ X0 `# C& H
```
) |' N2 `* W( I* Y+ d; ?8 { add_action('init', 'create_custom_post_type');: Y: n' H" u( {% e$ w4 `
function create_custom_post_type() {8 e1 H# ?+ V) [/ o; Z4 S7 f. j1 M
$labels = array() Y& _, t0 ^" R6 S2 c# D- i
'name' => 'Site Wide Notices',
6 m$ {' l" y9 O 'singular_name' => 'Site Wide Notice',
1 S, G* V3 ]6 [7 x 'add_new' => 'Add New',
m4 r D H# B* C6 K0 t 'add_new_item' => 'Add New Site Wide Notice',
. A; f/ k: N) [9 `! ]. H$ @ 'edit_item' => 'Edit Site Wide Notice',
9 S; z& H1 C/ T( `$ M- W4 X 'new_item' => 'New Site Wide Notice',; C) W# [/ g V! e
'view_item' => 'View Site Wide Notice',
- v1 U u' ]( V9 s1 d, @7 S: V 'search_items' => 'Search Site Wide Notices',
$ q, g1 A5 Q+ q3 F4 t# b, B 'not_found' => 'No site-wide notices found',
6 u, w% L3 ~: F+ } 'not_found_in_trash' => 'No site-wide notices found in trash'* X9 u: p) |2 `" `" S
);
( q9 w- u. N3 Y' d3 b, C% x
& q8 I* w- U; x; d+ Z! [ $args = array(
9 v- W. H1 L, B( s0 t( M 'labels' => $labels,
3 p0 H7 h' A6 H( T+ X( d, p 'public' => true,
/ z0 ~- b, J2 s; H5 r 'has_archive' => true,- h4 g$ c# P9 m; G5 C8 _& X
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),/ l0 j6 P! h6 w! S; l
'taxonomies' => array('category', 'post_tag'),. K3 ?3 S- p1 K6 s0 c2 O- v4 `1 Q
'menu_icon' => 'dashicons-megaphone',
5 d' m ]. O# M2 N 'menu_position' => 5,! U( H. @" @3 C" [6 X. F% M
'rewrite' => array('slug' => 'site-wide-notices')
6 E5 ^1 h8 r3 v );
6 Q9 `6 ~3 V; f$ T# v+ P/ E3 ~" k$ G( }/ ~6 A" r* _/ b' M
register_post_type('site-wide-notices', $args);2 g1 D) b1 g6 B& g5 {" D- P) `
}" V( o3 U' O3 i1 ^
```
( \8 B' N9 k: L) r! y4 I% u
4 C: w- j4 Y" H6 ^3 f5 V 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。 s% [( b9 |( E! G+ r! z- j
& j$ _1 u) O3 A3 X+ o6 j5 B3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:# Q' i# O4 ^- n V* M7 `$ s2 c
! L5 _6 M$ M# y
```; Y# I' z+ b2 k& o( h* s" C
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');' U, K/ y* p& a
function add_site_wide_notices_boxes() {
8 M" }2 @2 h3 [6 w `1 Y add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');( p1 O9 y; {& Q6 M/ G5 F% t2 P, x/ g* y
}
1 W6 G0 ?! {1 X1 r8 v! o a5 d
: K8 i+ R4 _5 x* _# l function notice_details_meta_box($post) {
# |' V1 v) _: ]5 r, \) a wp_nonce_field(basename(__FILE__), 'notices_nonce');
2 c1 D& k: u) I0 k6 } $notice_title = get_post_meta($post->ID, 'notice_title', true);$ `" V& c* S. m2 ~" R0 f3 e7 z* y+ \; x
$notice_content = get_post_meta($post->ID, 'notice_content', true);3 ?# o, ]( H: e; k
?>
) B- F- _# L, G& m% A& c! F) B <p> U6 C1 h+ B, ^& W6 R5 o. x% X
<label for="notice-title">Notice Title</label><br>$ C6 A' e( o4 M" T4 S* q, H. e7 b0 h
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"># q0 i `. m s; |; _8 ]3 ]% N
</p>
$ ]1 G1 F: x' B2 R! t8 Q5 b: j <p>
, E% m8 ^( g: v <label for="notice-content">Notice Content</label><br> M2 B% [4 L# R- b/ `, s5 |
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>& \& {' d2 `& z: C4 ^1 s
</p>
9 B; J. j; Q2 S m$ r" G/ Q <?php
/ Q" h: O# i4 h }1 J: Y. P' b. b4 }/ k
* p+ F& O* a: \! F9 b* N add_action('save_post', 'save_site_wide_notice_meta_box');
, Q- w7 W/ m$ G* a1 C0 s: G function save_site_wide_notice_meta_box($post_id) {( h# b2 ~. W6 Q+ G6 _
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))- l- [' J1 O. F& ]* G& x
return;7 I3 F( M* J+ J/ B5 j
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
/ w- f4 p: a3 _2 z return;! C& P2 R, W) t; i, j1 ~$ q$ a
# R! S! b" k& }/ y if (isset($_POST['notice_title'])) {
! Q' L' `1 w0 ]# m update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
' r( X- q6 a! o* S }
7 p& _6 I7 h+ N3 X+ y: T if (isset($_POST['notice_content'])) {1 p7 Q' u4 R4 `: f3 U* i
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
* d, ?7 N% I$ k) z, [ }1 S2 d5 u. g$ X) E% e; ^9 l1 |5 Q
}+ g5 C9 r& w# O' S0 P
```
3 n( S6 I9 P$ h o( R
& z! D, I6 ]. s! e5 x6 B$ Y 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。2 l3 R% R" E1 M" K' \# K
7 j3 N( ?: c V
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告: \% M* M D) o6 l
* r! v2 Z/ _3 @8 R
```2 l; l m9 d4 d5 j. [6 T
$args = array(% M( f7 @2 A4 g; D
'post_type' => 'site-wide-notices',4 Z$ \- g+ S: w) s% S
'posts_per_page' => 3,
5 C+ D0 J; g* D N1 ^) F, s9 r7 S 'order' => 'DESC',
1 I4 V+ D% M! D* Q! o4 R- g' r 'orderby' => 'date'& Y$ P) d5 {: |6 o) e9 U- ]
);
$ M, `5 m% I1 f( K $query = new WP_Query($args);6 {- z( G$ _: w- i O0 j9 o1 X' A
if ($query->have_posts()) :
& W& l1 B: C, C7 ~9 u) P8 b while ($query->have_posts()) : $query->the_post(); ?>- E4 h+ Y$ H8 M7 R+ H: z
<div class="notice"># Z0 ~* i" N( p7 M
<h3><?php the_title(); ?></h3>
( q: U- I" c7 \+ J <div class="notice-content"><?php the_content(); ?></div>2 O6 |8 {- {. g; |
</div>
/ s# I% ~: ]( p <?php endwhile;8 `/ s: u3 a+ F( H
wp_reset_postdata();
5 r& R$ w2 e- _9 H) L% i+ Y# q, F& d. E endif;* e( f' w0 G5 d: o% G$ s
```
" j6 o5 A, Z& H1 [! \4 t* v5 u4 R2 V
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|