|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?. S; P1 x+ ]1 D+ Q2 _% c
# O0 [5 ]5 ?/ m! O5 s+ |如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。4 B4 F/ w, m' |3 |* m
, y0 t! e2 j, J/ K
以下是创建自定义插件的步骤:
1 E0 X6 n6 t" K; `1 }
8 \$ O# |- Y/ Z7 |1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
" N: e5 _! d ^, w* _. k; s w* O* d- }! }4 I. O: e$ {" \+ A
```- @1 Q$ c' L' _7 m! G9 m+ {
<?php
9 v0 c; s% j' M" ]1 V u$ m3 S /*
3 T/ Z q, D8 B* Q+ ~# D Plugin Name: Site Wide Notices Plugin6 {# o, J; T Y* z& s6 C' o' w
Description: Adds a new custom post type for site-wide notices.
- P; B4 D- c2 ?# i1 u Version: 1.0' O. `) t/ L0 q+ h+ F/ ~/ b
Author: Your Name
8 |. w$ L1 x7 a) M/ N Author URI: http://example.com
5 {; T& t+ n* K' f */
7 d7 J/ b4 T% i. z( r1 _7 c; M& p; I) W5 K' ?
// Add plugin code here...3 w+ a6 d9 C* }7 C6 `
```7 I5 n8 f" S5 C9 b* y+ `& s; E
2 V- w f Z( { 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
0 b2 F$ g% R$ f, r7 U v; S5 L* y! s* M' s0 r0 c
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:/ j/ `. b) k& K# |$ M4 l
+ k7 d4 z/ o; O* Y, c4 y ```& Z2 x% W* g' K+ ~# E" o1 J
add_action('init', 'create_custom_post_type');: j, O* _- C6 E: _+ c
function create_custom_post_type() {
, T2 ]7 d, r% ~/ C8 m $labels = array(
8 ^$ Y. U; w5 X d' E# r 'name' => 'Site Wide Notices',
0 o- ^" B8 X; } 'singular_name' => 'Site Wide Notice',( N7 k4 S b( n/ H
'add_new' => 'Add New',
C6 U# j+ w- ]# ~- W# T! f1 p 'add_new_item' => 'Add New Site Wide Notice',
) O9 ]) j! v) W% O; ? 'edit_item' => 'Edit Site Wide Notice',/ m; b5 m) j3 z% t! Q5 o
'new_item' => 'New Site Wide Notice', N2 T% O' O; \$ E
'view_item' => 'View Site Wide Notice',
! L# K6 T* z' H* y: k/ W$ O 'search_items' => 'Search Site Wide Notices',
8 z- V7 P6 A# _" v, y( M 'not_found' => 'No site-wide notices found',. g7 `. F! u6 ~6 z
'not_found_in_trash' => 'No site-wide notices found in trash') b/ ~+ g( L7 ^1 f* P
);; O) h' ]* F! F4 j, Y
5 ~. c6 o) ]7 T$ F: Y $args = array(, S6 F5 m9 e# H! F
'labels' => $labels,
# t6 M" T6 w5 }( c% V2 x$ ] 'public' => true,
8 ?/ U/ P0 d& T 'has_archive' => true,
$ S. A l$ t2 w5 N1 j! x 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
6 f5 d5 K' L- F/ q: T$ c. G' c# Y 'taxonomies' => array('category', 'post_tag'),* Y( T8 J: K" h9 s1 t
'menu_icon' => 'dashicons-megaphone',: f2 ^) v$ O* o2 q% f& t8 d
'menu_position' => 5,
- ]- D. [5 ?. u, Z! O& h 'rewrite' => array('slug' => 'site-wide-notices')
, `7 C+ k6 P Q m );" ^7 \$ e5 `9 i# r* ^2 c
* K4 Z. ?0 N0 Y n
register_post_type('site-wide-notices', $args);
. c% p0 E/ v5 F% F" n }. J |1 s/ p( q1 m, F# K
```
+ J9 t+ i" J( o) M2 o# [# ] u, V5 F
: N1 B. ~. i w7 d: \! F 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。8 C2 W* \6 A( e( z
- m$ W9 K! g9 [0 b+ n$ O
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:1 D* z8 E( ?" T% e' B) J* [. \
2 r, B, v S7 V
```
( U% @; ?9 O: S" ? add_action('add_meta_boxes', 'add_site_wide_notices_boxes');6 V; w( M2 h, n+ }
function add_site_wide_notices_boxes() {: \; S. d: q3 E! _9 h6 a8 c
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');1 D* Q. l8 n1 z0 [# C. W" P
}
% v, z, j. |% Y6 D) B/ {2 A' o8 A" p/ M; `
function notice_details_meta_box($post) {
9 A5 P1 C: Q/ j: M wp_nonce_field(basename(__FILE__), 'notices_nonce');$ u, I7 t* f: `: M* x& l' b1 L/ v* D
$notice_title = get_post_meta($post->ID, 'notice_title', true);
( p+ Y- Y d8 [0 j c; p $notice_content = get_post_meta($post->ID, 'notice_content', true);* Q+ [+ N. p6 E# z
?>5 ]* z$ o: P" ]
<p>
6 m% B" E& _7 K- S4 A: e <label for="notice-title">Notice Title</label><br>
6 |: |% k* J" _0 e <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
3 b; w. e5 ^) r( L2 J( M, b </p>. R4 S7 b S+ z I
<p>
; ~, `* t5 C/ m; A5 Q+ V8 [/ I7 _' d4 n <label for="notice-content">Notice Content</label><br>
- F. b' h: Y( i C+ t <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>% h% K* o. B% ]1 I
</p>6 [9 B1 G7 q% k. o% L
<?php; K2 v' i5 a6 d" K
}# F# {6 ~8 M& W. l Y. A
- ?7 o0 O. i5 l5 F, D add_action('save_post', 'save_site_wide_notice_meta_box');: g3 \! m" {" @( Z8 A0 ~
function save_site_wide_notice_meta_box($post_id) {
" G7 f% N: a3 T9 B% s if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
; g* H7 G* o$ J return;
# X8 b0 P$ ^5 N+ z/ `- ~ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
) X1 Y' k4 `0 J6 R. d- W) k/ W# x return;& ^% B m& e7 ]5 V0 R
' }6 ]/ E9 I0 O. J9 Q8 ~% o if (isset($_POST['notice_title'])) {
: [! c5 V6 a8 j1 |/ a7 p+ b) _2 l update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
7 B/ v& u% d# Y6 [& ~: T) P }( O" M6 J' Y$ ]: p+ P+ U4 j$ g
if (isset($_POST['notice_content'])) {+ r6 w: ~: ]) a. L5 s1 Q
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));' l4 a+ t! u9 T( e2 j- k! i% @
}
( s; `/ L# J/ _' }9 @# J }
' `3 i( s0 O; h; j) v! J ```2 A- d2 P. n4 |4 Z& G1 z o
: m9 y# i# Q; r8 p c
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。: e) `4 v* J. n$ t, w' [
3 @6 t/ y. I8 _3 ]* t3 j' }4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:- \* a* c% a$ R/ W, B
' e4 m3 s! J* r" N3 q
```" @# [& z5 h" {
$args = array(
& F. e* E0 `: `* L 'post_type' => 'site-wide-notices',' }7 h; J. _4 Q1 I
'posts_per_page' => 3,
" k, n1 N) M1 \ 'order' => 'DESC',
" w3 _! C* d* ?8 O0 f 'orderby' => 'date'; s7 I" G8 K( T
);
; T1 H# f) V2 a X+ c% I $query = new WP_Query($args);
- ?- B& L b3 @. N/ h if ($query->have_posts()) :" G, V K5 r' p
while ($query->have_posts()) : $query->the_post(); ?>5 f3 X3 B. r3 X( E& C
<div class="notice">
% e4 l4 N& s5 o# R4 b& j <h3><?php the_title(); ?></h3>& J3 C' ~9 m9 N" V- x
<div class="notice-content"><?php the_content(); ?></div>
( t* B) H, F# J" n4 Q) y* ]% W: r </div>& B4 z1 E/ y9 e% [9 Q
<?php endwhile;' g: L1 M" [/ O8 o: D
wp_reset_postdata();
; h& x. r( l) m8 _7 W7 D Y endif;6 D o/ v: y7 c0 y6 c7 g7 m+ L
```
s" m: ^, S" z3 E7 Q; B
, J" R$ {- [5 T 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|