|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
& _' z# ]2 n3 W+ ~7 T* O! Y
+ [* N6 {6 b% ]如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。* w1 K! M9 ^/ p# ^4 H3 u* Q
% ~7 Z7 R; ^/ f4 ]* p% Z0 x
以下是创建自定义插件的步骤:
" a# D. u( t5 H2 [5 J' u2 G+ K( q0 J/ t- g
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:! k) T4 B/ v) R$ m1 B; Y, s$ k
9 A" U+ _6 Y* S; N$ J: |6 I8 R
```( h* y( f2 X& E' [: R
<?php
& J4 u1 ]: q3 Q2 T+ j( g% c7 H, G3 d /*
" D0 ?1 e% Z/ \ Plugin Name: Site Wide Notices Plugin& c6 r6 \/ z h7 z7 G- Z
Description: Adds a new custom post type for site-wide notices.. z! T& R$ k/ ~7 ~( I! c
Version: 1.0
w! }9 f) n8 o Author: Your Name
( a6 d; G8 D9 V8 A! @: Q% S Author URI: http://example.com
( J. ]% S! a u) y/ a& {; J$ e8 ]7 z */
" o8 K$ B! J1 M A: B6 M/ g8 P5 O# O8 M5 d
// Add plugin code here.../ B. T' [' f0 ]9 f2 Z' p
```: F e" `' [* a3 _8 @% g6 v
5 f' y0 T: s8 [ c2 V x; _3 @
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。3 i! @, z0 e( e! Y% v
2 x) A3 i5 X' x _0 n0 `2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
8 [1 P6 Q9 w" a& e* |7 P* ~5 B8 m. ?! W$ L. `& [- f, @
```
* e5 g9 A2 ^7 z3 S3 D add_action('init', 'create_custom_post_type');* k* v7 x. S* p# c- N3 D p* d
function create_custom_post_type() {/ X6 B0 g. c, }6 _
$labels = array(
8 m3 M U6 K: Z) L9 \ 'name' => 'Site Wide Notices',4 B' q% D1 j! F$ H9 @5 r
'singular_name' => 'Site Wide Notice',7 r7 n( N; Y9 D
'add_new' => 'Add New',
' [: {3 C* A# j5 Y 'add_new_item' => 'Add New Site Wide Notice',8 v) p( L1 B; x7 `
'edit_item' => 'Edit Site Wide Notice'," Z- P) z { F- G- w9 S" K
'new_item' => 'New Site Wide Notice',
* L9 F; I2 A z: d 'view_item' => 'View Site Wide Notice',
9 {' @- W. _: K+ B7 H 'search_items' => 'Search Site Wide Notices',! `3 {) D* q \5 f( s
'not_found' => 'No site-wide notices found',$ D1 B$ {* O. d; U" \3 u/ }. y r
'not_found_in_trash' => 'No site-wide notices found in trash'. p, @. y Q% M0 e5 H2 V+ I
);
# x- I* m% x: M6 b+ B* o% ~" M. N! S% _
: P. w" c( _4 ]! | $args = array(
8 i$ T% v- X* A+ a; f9 J 'labels' => $labels,
. h8 n: y* r* k, j 'public' => true,7 o M/ p f* e# t7 j
'has_archive' => true,) Q( c# `* _" F# g' z4 H
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
. z: a2 \+ m: p2 \1 H 'taxonomies' => array('category', 'post_tag'),
7 c; ^7 b9 F8 p" L 'menu_icon' => 'dashicons-megaphone',
% J+ |- |6 e! Z+ H 'menu_position' => 5,
& R$ g/ ~0 e n' p) L; M% x& Q% M 'rewrite' => array('slug' => 'site-wide-notices')
: D5 T4 \* u2 B Z );3 c5 J2 W: u0 f/ F8 [
+ S/ p/ M+ S- C% }
register_post_type('site-wide-notices', $args);
$ X# y/ i4 C+ q4 K; |1 ? }
r6 P+ W! L# C9 z! m0 k: W ```
) M9 v& \- {$ M( O2 @3 w+ ?9 C% M* I; \
; D9 V. w, V: g% f 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。- ^! R' [+ F& r& ?! |( d9 a
0 o3 p7 x: X% ?3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
6 J& ~5 F# r" @& K$ @$ \, U+ f6 K% L5 A2 e
```
Q5 N N, Z6 ^8 A) i# h; T add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
3 Y/ a& Z {3 W function add_site_wide_notices_boxes() {
6 x! c. {# Z8 x2 j) z$ `* a+ r add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');% N# ]+ X5 K; G6 E* e6 \! ]
}
" j( s4 k$ s8 T$ m' m. y' g4 z7 P; A
6 K3 ?: X( S0 @9 o% z/ c function notice_details_meta_box($post) {
/ g: h( [: ~9 t- n7 ^4 ~# j: W) g/ [1 i wp_nonce_field(basename(__FILE__), 'notices_nonce');
" x- @; `0 ?; D0 e1 x; [ $notice_title = get_post_meta($post->ID, 'notice_title', true); X7 ~' P5 W: m+ Q4 O( F4 F/ H
$notice_content = get_post_meta($post->ID, 'notice_content', true);7 i, K0 D/ s# W. f: U/ i% ?
?>+ m4 y& t7 y- y9 A8 a1 O# L0 i) s
<p>
& S0 ^% D* \' s <label for="notice-title">Notice Title</label><br>
0 L; ^- T+ ^) E8 z <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
% X& t/ p9 r2 C3 L0 ?2 U5 A( z# Q </p>
' G* w1 l/ h F; R <p>
4 {. f: k" t9 o' ?, p' N1 y# G! Z <label for="notice-content">Notice Content</label><br>
1 U) r! W* L# c, r3 h <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>; U) b7 F0 x' W/ q
</p>
1 ^7 `9 h# @1 ^6 B- _$ w <?php! K; w. F' e; V9 ^8 |3 E
}1 q0 y2 `. v+ z
$ _* O& S* o9 N5 u add_action('save_post', 'save_site_wide_notice_meta_box');. D- h7 c" v/ X: w4 `. q' J
function save_site_wide_notice_meta_box($post_id) {
+ o4 T# h7 T3 k0 N3 b if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
, M! E; e" g/ m6 o9 d return;$ e8 i% x) J. G) e- m: E
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)0 l2 r: U7 F$ G0 X+ F- z4 L& ^
return;. S; d. E1 o0 r+ j7 [
* j1 c* c5 d2 i p! w/ M
if (isset($_POST['notice_title'])) {3 H+ L$ x/ k# v \+ i4 m9 W x
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
7 E3 B- ^" U4 X; j- `, M% ~ }/ d9 t$ t/ g! A* n7 k
if (isset($_POST['notice_content'])) {
$ D/ b6 B' r0 t update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
# }5 B% @, B8 z. Y: H/ a8 u. q& ~ }
! q" c2 x3 M) R' w, F# c5 L }
( c. z& A( ~9 G& P" R5 o/ y W# E ```% Y4 i0 l& W1 B1 I
: |! g! [7 `0 H: L- ~$ @, F( l7 l
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。/ d. N) Z9 C2 z
f1 n( p8 S, n$ Q' W! H
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:' \1 S9 j& d7 Y
- u' k. q; V, X" O8 E' M) f$ m3 c ```
$ }+ }3 p4 v$ O! Y' W2 g $args = array(
9 z: ?$ T! G( O8 D0 U" z& e) e 'post_type' => 'site-wide-notices',
1 B: n7 o- B f8 M& z ?9 Z 'posts_per_page' => 3,3 N/ m8 l- b1 T- O" ?. t) M
'order' => 'DESC',. A$ p. |9 S f. M5 M3 X9 s
'orderby' => 'date'7 y4 F/ n4 m4 f3 T3 ?! ^$ }8 }/ H
);* {- c1 z' u# H" d
$query = new WP_Query($args);
4 b2 s% s$ O' x6 I8 }) O if ($query->have_posts()) :
8 Z& d' L( L t9 g5 t- z5 \ while ($query->have_posts()) : $query->the_post(); ?>
4 b1 l+ \% v) A2 U; ^3 f <div class="notice">
# C0 s) y9 I+ L* x% h. g5 @9 N+ l <h3><?php the_title(); ?></h3>
1 g0 E x5 I9 M! o4 c' J0 f <div class="notice-content"><?php the_content(); ?></div>; l2 E4 v7 N3 s& A. k
</div>- ? j1 Z# i! p( S& h/ S, @1 N
<?php endwhile;
( h- U5 i9 w! I9 v' W% C8 w wp_reset_postdata();
7 _, L$ V" g0 l; j- n4 G endif;
6 G' J, H: |5 e ```4 ~( r |3 B+ C
" [* b7 e: C% I# L( h9 _ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|