|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?2 s, s4 Y! t3 n K
" i: E: j6 [" ]4 ^如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。+ I1 V6 j# G9 V7 ]1 d4 Q. d/ J
) r F! R# ?" V( d- ^
以下是创建自定义插件的步骤:
- {. r7 ]$ C* ?) K- ~- Y" d3 Z; ?+ M% [
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:* [2 }: u4 s+ K& g. k7 f/ J
, i5 ]3 H$ f- S% M: `
```; L, N8 `' J/ ^2 m
<?php L4 \# ^& X( ?( m
/*
% M5 \# E: e) A* c; D: a Plugin Name: Site Wide Notices Plugin: w: ^# ^5 D. J7 |2 X
Description: Adds a new custom post type for site-wide notices.1 N8 e/ a: x; b+ a8 X# }
Version: 1.0
0 p' s* t$ c+ F5 g0 H' N* t Author: Your Name( u6 f( d* w* y) W! `" x7 o, O
Author URI: http://example.com& j5 s, Y: D5 u# l5 s' C
*/
4 n, j8 B& R; w; p' q% @/ s: L, B5 g$ N" w# M, p
// Add plugin code here...- x; a1 ]! f8 R7 @* j& S% V
```. T0 t2 l/ m& h
6 q: ^) }! y" S" Z- ^ 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。5 w3 P. ?8 d: z7 r+ X! V1 D7 o8 I
' O+ C$ C' T, @' f2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:+ k' [4 y" O1 d/ w* g9 k
1 L; a% y' ~) T2 A u$ O9 l. f
``` A& a0 Q) W3 ]" X$ f
add_action('init', 'create_custom_post_type');1 Q% \; N, ?1 T3 D
function create_custom_post_type() {
) f2 G4 _! y1 P: B Q' x' r9 { $labels = array(
# W8 A" F% W$ v# q1 L 'name' => 'Site Wide Notices',
}0 k; D1 Z9 f2 }; P: q. W 'singular_name' => 'Site Wide Notice',3 e% }6 W P: g6 p
'add_new' => 'Add New',
/ D: @8 Y' }! {! J" g 'add_new_item' => 'Add New Site Wide Notice',) R% v2 ^' m0 ^, I
'edit_item' => 'Edit Site Wide Notice',- r$ V5 J3 _. Z! E; K1 C: O, X" f
'new_item' => 'New Site Wide Notice',+ m# b, F/ O0 v, F/ A$ D6 p
'view_item' => 'View Site Wide Notice', @2 _8 O1 S1 r) W7 {6 q
'search_items' => 'Search Site Wide Notices',# \- l7 R! x- v+ b
'not_found' => 'No site-wide notices found',6 p/ V' w; ` T! t: x
'not_found_in_trash' => 'No site-wide notices found in trash'0 o* Y, j @8 `8 H
);
' T' x# [4 w5 ?) z" A4 i; l; a
% A& E6 ?) [( e $args = array(
$ U7 z5 Y- r. U1 ~" i+ E+ h 'labels' => $labels,/ ?/ _' Q# _# k, T' u
'public' => true,. s; E4 ?# R3 x- x( G( t+ f
'has_archive' => true,
6 d( H4 f3 E6 c( r& x! a, x 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
0 K" g b, V: t( O% Z% e V: ? 'taxonomies' => array('category', 'post_tag'),7 X8 J) t- o" C; c
'menu_icon' => 'dashicons-megaphone',+ C& Q# o: D. [+ D$ D$ Z
'menu_position' => 5,
4 A: c3 W9 d! ]& W# _ 'rewrite' => array('slug' => 'site-wide-notices')- L* x) r1 r* S" S& I
);
+ `1 U9 U' I& b4 i- f5 K' w0 r
$ W! `4 }/ w) O! w0 T) l G) P register_post_type('site-wide-notices', $args);
. S8 U# Y$ F; f }
9 [8 `( c3 j! l9 n) ` ```
9 {" e9 P+ w8 K; e' S' U _- a( T9 e1 j# B2 f
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
: v9 V' _# J) A
7 [. L$ K1 K% ?9 y( ]3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
) S& f) ~$ U7 U4 B0 D8 B/ ?, D0 X6 n# e, B1 f
``` F h+ y0 k( z& ]) [; k
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
" x5 p) T$ c+ F8 b( p$ |+ ]3 s function add_site_wide_notices_boxes() {! E# x/ J9 B! `& k+ D# Q* Q/ q
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
1 L Y& D+ u( @* v: J2 Y' N$ Y }
1 @) u F- A: k6 j
6 _) i* c$ x9 t+ z b/ B function notice_details_meta_box($post) {
4 j" O) \% d/ O/ w wp_nonce_field(basename(__FILE__), 'notices_nonce');8 V2 U! \8 n7 n" X* `: P( [; V
$notice_title = get_post_meta($post->ID, 'notice_title', true);
% E+ i# ?/ G8 w7 w $notice_content = get_post_meta($post->ID, 'notice_content', true);& g. e+ t4 j n g! e4 {
?> Q( s( d! a3 _( p) f& |
<p>( m" B: a8 _+ M6 j
<label for="notice-title">Notice Title</label><br>
, X1 y a: S* A2 g6 ] <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
* s G$ M6 n) G+ h g. ]. V </p>- N! k3 _; n- J+ F
<p>: i+ N3 \4 j- c4 s1 n ^
<label for="notice-content">Notice Content</label><br>. r i( Y9 b4 d/ R
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>4 O) w9 _% Y& V. k8 x* a1 T$ P5 H
</p>
8 h/ V! T6 k8 l" e0 N' b% t <?php
: F: K1 I/ _. d+ V" C1 e }
; J0 x( B( d1 M9 X% ?. [' b/ C6 W& I0 ]7 d2 U% s) q3 y
add_action('save_post', 'save_site_wide_notice_meta_box');
% i" k+ s6 \, P% ?$ U( S6 y' L$ t function save_site_wide_notice_meta_box($post_id) {4 t8 Z! q0 j/ J, G8 A
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))9 |4 v* A! Q" g: d* Q, a
return;; X! R, X+ h, F4 Z
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)% g3 G/ i5 G, U& G2 v2 Q
return;3 n1 C/ w9 O* M9 N% S6 Y; R P; o
$ s% Q+ T. I& m- ^/ z# l if (isset($_POST['notice_title'])) {
& t0 A9 X9 S5 i update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
0 ~% y! d9 Y, d& U ^ }
. Q4 a w& g) C# ?7 R if (isset($_POST['notice_content'])) {% G# B6 l; b: B8 L% j
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
. d* y. h0 D$ a& `2 f2 y U }+ D2 { H: @$ m& P; K( M
}
* I" D( `# Y5 D, d2 K1 B ```
% ?5 V7 ^& U! ?" h' g& P4 P
( y. Q& g) d7 F$ R 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。' v* I7 D8 y' J
0 Q9 v: p# `7 A8 X# v4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
$ V) d# ~* K9 l2 A% t& T, n3 l$ n* z( r: H! p
```1 J1 E, }, m) F# G" E; W6 l
$args = array(
5 v7 U1 k; K: B+ y 'post_type' => 'site-wide-notices',
9 ^4 ?6 h4 M' F3 W 'posts_per_page' => 3,. v) h8 s6 j! P; N- x; V
'order' => 'DESC',: ?) K9 D- j- V; P
'orderby' => 'date'
1 ]% |! i- l6 j" l8 Z; P+ [ );! ~1 a8 j0 b. Y1 g' }' A3 `; F
$query = new WP_Query($args);0 s, g' b; O3 C) t! Z3 U$ ^- }/ q
if ($query->have_posts()) :
9 k/ i' y" N; q9 C: k* { while ($query->have_posts()) : $query->the_post(); ?>
9 O$ E) S7 L# u# S <div class="notice">
6 k9 Q9 g: e! n D <h3><?php the_title(); ?></h3>
/ [7 c0 A O4 @% l" J. Q <div class="notice-content"><?php the_content(); ?></div>
5 `' l9 N2 |% [8 h- Q </div>) H, x$ L4 Q6 _5 f9 L
<?php endwhile;/ C; A9 o' m9 R/ q5 E% c$ C. y
wp_reset_postdata();( Q* w6 z8 c- D( ?! p5 ]
endif;) ~1 J8 T6 l0 g0 T5 y& \1 N
```
" g& h9 Y3 I0 I8 V2 y6 R2 E( b8 L8 M; S7 l q
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|