|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?3 R2 y2 ~) o# P; t1 b
" z) C/ d8 w3 |0 J. Y8 N7 y7 A, |
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。7 e* u/ R3 z# A- v' N% P
$ d3 O& U( d; H! A7 B% l% I! ?. s
以下是创建自定义插件的步骤:: q; L2 ^3 c, y, [& ^5 l
7 r+ i0 g, E0 l/ x w1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
/ }3 O; w) V/ S6 B
7 b' }% n l; W ```$ T% _8 @+ c' f2 z8 u& K& h
<?php9 @$ k% p( c* N- c
/*" ]7 Y0 {! u$ z2 t
Plugin Name: Site Wide Notices Plugin
0 q' O% Q3 B5 `/ H9 j" u Description: Adds a new custom post type for site-wide notices.4 q3 o6 W$ S$ V# q
Version: 1.0
9 A* N8 }( `0 }1 t8 V# h1 z Author: Your Name& c/ g. I$ b# [1 {1 e, O. s6 y
Author URI: http://example.com+ G: {/ G* E: {
*/
+ g) B4 m7 E( d4 \) ]: \6 { c/ N6 R+ G9 w7 ~$ X
// Add plugin code here...
& d7 r9 z/ V) v9 r v ```
1 Z( C+ X% G+ Z9 v( p7 y' r$ a E: v0 j6 T# K& H& c2 L8 e2 u
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
7 Q/ J! b' Q4 M/ k) I; |* Z2 G8 ^. T! p9 W
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
4 Y ~3 t* u* Y8 J: Z U7 s% M# {! @5 |& ?' D
```8 H+ X+ p9 v8 N& Z6 Q
add_action('init', 'create_custom_post_type');
6 y/ ^* `2 m+ A _ function create_custom_post_type() {
1 C; }6 T W! }1 s $labels = array(
' N K' g' B. q0 O* s 'name' => 'Site Wide Notices',8 p# Y. T! u, ^& V$ a
'singular_name' => 'Site Wide Notice',
, V* l2 S6 o u: w& k. p) G 'add_new' => 'Add New',
7 N0 ]4 H8 P8 M% | 'add_new_item' => 'Add New Site Wide Notice',
; r5 ]2 `8 E O; k' E5 n+ B 'edit_item' => 'Edit Site Wide Notice',
# r$ A: d- e- S 'new_item' => 'New Site Wide Notice',
- G( Y* v% r B8 G `2 O3 x 'view_item' => 'View Site Wide Notice',
9 ~' D7 o3 w3 d1 e7 L' V+ b6 h+ s0 c 'search_items' => 'Search Site Wide Notices',
* l0 k6 ~/ H5 Q* n8 Y 'not_found' => 'No site-wide notices found',
/ n8 r* k8 K/ c; s) n, ]7 B' @2 R! ~% G 'not_found_in_trash' => 'No site-wide notices found in trash'
. S2 [+ C$ _; p3 }8 F );4 N& T' p0 K6 K" ~
! q# S+ s; \! X# Z" z( | $args = array(
# M* p/ R" X3 G1 `- s$ ?. V; S 'labels' => $labels,' p' K5 g# {+ y3 k' a5 a/ d+ s
'public' => true,% F. a! h$ w; k. Y5 S
'has_archive' => true,$ n+ P" p9 {/ L8 K. h: H
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
5 Q0 K3 N/ _9 ]; K/ S 'taxonomies' => array('category', 'post_tag'),4 s- V1 D2 B& c/ }
'menu_icon' => 'dashicons-megaphone',
7 e8 g3 s2 M/ l) [ 'menu_position' => 5,+ h0 y- R' p9 A* l5 Q' H! e
'rewrite' => array('slug' => 'site-wide-notices')2 S5 l& @0 z9 J; ]* W( j2 E
);
. e5 N+ ]/ \/ V
7 [+ [6 K8 m. l: Z register_post_type('site-wide-notices', $args);- Y" k* r* F: P( `+ P
}' D0 y |( D4 a1 W: l
```
9 T# P! T- S( n+ Y+ t6 g/ t1 D
- b" A+ F5 \7 W4 s7 d& U5 c3 J 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。$ ~7 [ ~! n7 i7 k) j; @& g x
$ `( g0 }& b: {4 q- E" w/ K3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
" H, [" n% K: B+ z4 ]/ e* P$ A* {0 M, y' R7 `) Z; Y* s
```2 _3 h- n# x' e7 i% @+ ~& o- b
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');9 J/ u9 d9 P, [% c/ c2 Q
function add_site_wide_notices_boxes() {# E" N# \- z7 @0 G5 L4 H O, X
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
5 l+ O9 D6 Z9 M }
; k5 w& }! K$ F0 ?& c& v: t) ^9 ~ j# x' @0 u6 b2 W* f
function notice_details_meta_box($post) {- {4 K& b. c9 D" i. u7 M/ r
wp_nonce_field(basename(__FILE__), 'notices_nonce');
$ M; j" {( @; @& R, g$ [4 i X- ?9 B1 } $notice_title = get_post_meta($post->ID, 'notice_title', true);0 E" r- q1 P1 l1 ^3 ]7 f
$notice_content = get_post_meta($post->ID, 'notice_content', true);
% [2 t- g8 n' C& v) t, e1 x ?>
$ d" z* G2 Z) q( d <p>
& J$ q( c" f* z& c! c <label for="notice-title">Notice Title</label><br>2 c! n' }2 @4 M5 D( G9 m
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
- {& |9 z/ }) _+ l </p>
3 G' `3 I* ^: z% d6 E4 v f9 O <p>. ]3 i7 }* J6 \1 V+ R
<label for="notice-content">Notice Content</label><br>
5 Y3 n; z" C& z: j <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
# r( m8 g$ f" C8 K7 B, ^ </p>' c5 U4 r. M/ P6 Y& @
<?php
/ y0 b! a( Z7 r9 a# M& ~, ` }2 {, j0 w$ m1 d2 b, B# e
* B5 X) m6 g' M
add_action('save_post', 'save_site_wide_notice_meta_box');
' ]9 U8 ]2 v+ s: M3 ~ function save_site_wide_notice_meta_box($post_id) {& E8 w f: `/ x) n+ e
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
& y8 Y; p# p" w& L* M6 h/ y return;
4 W0 P( @; B$ H' ^! ?! Z( O6 u if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
* ~/ u' D) H/ Y7 }4 E }2 p return;7 m- |% o: {3 i q' |
2 c* E l# U+ m3 x+ U' m' [1 K
if (isset($_POST['notice_title'])) { z w& B7 P! B4 h! u1 |6 l
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) Q+ K: L" b7 p8 D
}
- z9 }! D* f* S2 S1 y, U0 |5 W if (isset($_POST['notice_content'])) {8 ^* X( t$ L) [$ k+ I) v
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
/ b2 G& U. k7 u5 x% N, q }. B* S/ h2 T8 D1 o
}2 o, o- @% v8 @
```/ V9 v/ G7 v2 @* ^1 K5 M8 E8 B3 I
% Q2 u. x1 A: z _1 b3 d' f 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
4 a1 K# L. u" G0 h( O }9 i Z) u4 |- V4 r
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:' m. Z4 m& R9 Y
* F; y0 i* z4 _2 G
```
% q. U7 h& K: w! Z6 q $args = array(
& B8 d/ H, Q- r c# a5 | 'post_type' => 'site-wide-notices',# J3 v' b9 n/ n8 {/ L
'posts_per_page' => 3,- z. O/ Z! y i
'order' => 'DESC',
0 [. N6 S8 S) U- m 'orderby' => 'date'
5 V& ?1 e* o5 E& ~ );
, s4 W0 @# g/ P% S! a5 A $query = new WP_Query($args);2 @/ @- ^5 W! B8 L; E9 J7 y# s
if ($query->have_posts()) :
# Q$ x- Q& q0 C4 k( ^ while ($query->have_posts()) : $query->the_post(); ?>6 v! [+ d" ~! M7 l! U" h' P4 B) ]
<div class="notice">2 P5 \/ ]& y/ \6 Y- @' r* g' ~$ m1 Z3 a
<h3><?php the_title(); ?></h3>4 B" Z, S8 a, C# A2 j- ]
<div class="notice-content"><?php the_content(); ?></div>4 O! _6 L# X* x
</div>& V$ J7 u" r$ a6 l9 k/ ]
<?php endwhile;
4 A E! s/ J! h8 {: F9 S0 X wp_reset_postdata();
! `6 D7 N/ [/ c2 {$ c8 Y) D1 { endif;. b3 [! p& Z+ e ]! j' P
```
+ T- g" j6 S9 ]5 W( ?
* c7 Y# r+ x+ G 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|