|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?* W, o6 a% L# `8 \- ^2 z
! n% k) G1 X9 |. S0 i
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。8 C% `. }% I. j& C1 k- r0 C
$ u4 N0 a3 P7 E7 T# E; C; Y( y
以下是创建自定义插件的步骤:
# l {8 {9 Z. w% ^2 q7 B$ K) P" r8 u/ M. Y1 L* u% V- h) Q
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:. W( z3 N$ K0 [+ \
+ A- I' c4 Q5 O+ G* f. ~ ```
" s! O' i1 y$ L' N9 n# p <?php
; B! \- z5 _# @0 d% ` /*
5 `( V& _$ j! {$ @ Plugin Name: Site Wide Notices Plugin
6 Q& ^0 g9 B1 R8 L& K5 s Description: Adds a new custom post type for site-wide notices.
5 k" d# @' }3 A! D3 N Version: 1.0' y Y- y" J Q* w* @3 B
Author: Your Name
' j) A1 ?' W$ f4 Y( c3 i, ` Author URI: http://example.com
7 W/ ~* G" {4 |4 s* n# W% w */
3 ]4 \; y. |+ X: K( p' Z1 `: t& Y% d* z5 o$ K1 t
// Add plugin code here...# x q# h; |+ H; V% u" m5 |
```
4 F( e* W% X6 ^( h+ x) L, E+ S% I0 {2 a2 N g
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。3 m! Z# G/ R3 `1 o! V+ n
0 ~. j# L0 x2 X, y6 s2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
b l4 ~. k9 P! g% ^( |0 p. s$ s. k% `# p) c5 p( `7 F* _6 A( B
```7 n( Z! a& ]* }2 T7 U) M0 v4 C
add_action('init', 'create_custom_post_type');
3 }( M6 H- d: ~* I function create_custom_post_type() {. N- p8 L' x9 T Z. E$ D
$labels = array(( `4 R+ u) o- g$ G
'name' => 'Site Wide Notices',
( u! t8 x* s3 K% t 'singular_name' => 'Site Wide Notice',
2 ~7 T0 M# ]9 `$ _ 'add_new' => 'Add New',: w. J3 |, H; X3 n
'add_new_item' => 'Add New Site Wide Notice',# F8 y( t$ E6 v' S; E0 t: d
'edit_item' => 'Edit Site Wide Notice',
6 s+ |8 c: N8 Y2 t4 P8 p 'new_item' => 'New Site Wide Notice',
, R; P+ v6 w; u 'view_item' => 'View Site Wide Notice',) W8 V1 O! E1 m5 R9 C! X
'search_items' => 'Search Site Wide Notices',
0 y, `0 ^- X% r: s$ z 'not_found' => 'No site-wide notices found',* b& t' K0 U* ^# M3 }
'not_found_in_trash' => 'No site-wide notices found in trash'
& r* j) q+ F4 E/ I+ f7 E# I* W );- o3 @" _7 z9 w1 X- z
8 t4 P# F' K1 c- g3 e$ @- h $args = array(
4 B' i, ?9 m2 B- O1 \ 'labels' => $labels,
! E' d) `6 R7 m8 I 'public' => true,. Y4 x6 T* K/ D; O
'has_archive' => true,
0 Z& Y$ @2 N" V+ A 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),2 Q; D [4 A( h5 U: c6 J. \% Z9 y5 i
'taxonomies' => array('category', 'post_tag'),
% s" a* m) k# M( ? 'menu_icon' => 'dashicons-megaphone',
0 @2 u5 p+ P0 y* N+ t 'menu_position' => 5,/ u* S0 d% n u
'rewrite' => array('slug' => 'site-wide-notices')9 r2 F: |8 s% c# Y. r; H/ O' S
);# {0 [9 r& }8 x: R
$ i3 Y# P# I4 \! m register_post_type('site-wide-notices', $args);
7 d. Q/ B7 T* z# r7 P. m }- r: m" S; h5 m% O/ @, W: R0 s& w
```
# s$ Y- k7 V" F0 }5 v9 x8 G( J C: S+ W" P! g3 ]' w/ j4 o
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。6 K# a" g1 X1 j G8 u& v3 T( y
7 \6 u; F# X, R, P* W$ v, C* Z
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:- M: X3 s9 M* j" t! ?0 A. y& H2 R
+ j- X5 _, z" x% B5 `: Y
```5 _5 A( K V0 N5 |9 h+ V: i
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
6 M. Y8 Y2 t6 ~) D4 R function add_site_wide_notices_boxes() {5 e2 I$ U! f! m, T: ?
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
: F; r- T5 s3 [4 y4 }% Y }' l: q; G- e* B! _% o
- x+ O9 x$ A @
function notice_details_meta_box($post) {8 f- s9 B ^, R* R: G
wp_nonce_field(basename(__FILE__), 'notices_nonce');
% G& I+ a+ U/ \6 u' G" ` $notice_title = get_post_meta($post->ID, 'notice_title', true);
4 g: q! G, J' p8 _; g- K. g $notice_content = get_post_meta($post->ID, 'notice_content', true);6 N- g! T7 f9 {* ~
?>
R: }2 m/ ~- Z4 o <p>; y0 {0 f- P3 |9 ~/ w) C, t
<label for="notice-title">Notice Title</label><br>
' `# \- {- H% e+ U& S" @' Z <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
2 q. X" I0 k' j! V </p>
+ @. U3 S* T0 J4 L* ?& q D: J <p>. L: S/ W) w' ?1 B$ S. D- I) Q
<label for="notice-content">Notice Content</label><br>
* k$ F8 G1 d- S5 w& ^$ W <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>4 ]; J* S; p2 W
</p>
/ B! V. M, O7 r <?php
4 @' ]: D1 X0 ^* t }3 K; N$ C# X9 V% l! {
4 R* {$ X) D+ ^, U
add_action('save_post', 'save_site_wide_notice_meta_box');, c2 n8 z" k6 c% _* O$ Q; v2 x
function save_site_wide_notice_meta_box($post_id) {
* y/ X4 K7 ]+ z* U8 o9 l4 b if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
& B" u# L$ Z( C return;
- @1 ~' u# I7 j# W% s if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
$ k% m9 J4 [, O' E& ^ return;8 q: K, V4 t, B$ G( Z) `5 X
- M5 c4 r5 ^0 N
if (isset($_POST['notice_title'])) {
! C% w7 B7 W8 o, E p, ` B update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
3 [+ j3 l5 p( o9 e4 z9 P }& ?6 i7 s( t4 w* ~. f
if (isset($_POST['notice_content'])) {
7 r: s& I% q, Z6 l0 ]; i9 t update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
" C, Z8 ` k0 s' _3 E+ I2 ` }
4 C, t, r/ i* d J& s, L }
# o5 {8 j# U7 P- g3 R ```2 J: u- M0 S2 R& O0 b
% C& ?2 ? |& c, [* Y 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
8 D" r4 K+ d- \5 k
; N2 A3 j+ Z) q, Y4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
4 v0 Z; P0 D, L
9 {; ?8 E$ A `- y4 } ```* b! d2 h; f a! z+ j7 o1 `- }# V
$args = array(
- ~" j3 ~1 Q3 n# a! W 'post_type' => 'site-wide-notices',
4 X( S6 _) a) y/ m! P 'posts_per_page' => 3,0 Z" w1 C7 z7 A1 n0 Y. P6 U
'order' => 'DESC',
$ s" i, a4 A* Y5 n- Z 'orderby' => 'date'
9 y w) P: G' f2 k% a );$ y& ?1 w w* {6 n
$query = new WP_Query($args);
" L& h/ f& S" w: C$ a if ($query->have_posts()) :
$ }5 s" j3 a: x+ }. l! [3 a. H while ($query->have_posts()) : $query->the_post(); ?>8 w. w3 C' }0 x, H% n" X B0 ^
<div class="notice">
+ Y. {3 u: S# G5 P5 }2 m1 ~' K' d: |+ L <h3><?php the_title(); ?></h3>
+ o& ^- T8 D! _& C! y# E <div class="notice-content"><?php the_content(); ?></div>6 n5 i) d: ^5 B1 z' b) ?( Z# Z
</div>
' E; `) ^' C# Q' n/ l <?php endwhile;
+ a3 @) ~1 P4 z4 J wp_reset_postdata();9 R( ]* @( s" z) I
endif;
* s7 C5 ?4 ?6 y: w: B# W ```
+ B/ z2 }) d$ s# p# I# ^
4 p# w3 B9 V- _/ C6 X+ s 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|