|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?) H: }" T& @1 R+ o, i; _
, f& s: J+ b4 k ]0 k- J如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
0 F! L+ _7 v2 h! N/ d1 P% e6 C& D: N9 P1 Y" R% F1 k5 B& t" ^: c
以下是创建自定义插件的步骤:
" S/ S1 S% f" y. y7 U. a3 R8 J8 x8 `( b- M0 O
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
+ U+ H& o% S$ s( d1 v% r$ j, \$ b1 z# ]! f; U3 F+ `5 m% j
```
1 N9 T* u! `) x( d$ _8 B# q <?php
5 f( ^7 m7 q3 [0 m0 [/ Z /*: ?' \! O9 e5 Z6 _
Plugin Name: Site Wide Notices Plugin4 U4 E7 d# G( w9 H! {# g6 C
Description: Adds a new custom post type for site-wide notices.
( c9 v' r7 K1 M. c Version: 1.0
$ w7 W1 A/ ^+ u+ p) t Author: Your Name
9 u- C! \# k$ h( X& ]( k% v Author URI: http://example.com2 G0 G$ D# v. j0 h k6 T/ E% W
*/0 G- S _( d0 q8 X- f5 ~8 h* d
- ~, b1 A5 c# L; u! P4 f4 s
// Add plugin code here..." Y ~# w* K6 K6 ?( s" i! o/ j
```
& [- h* D0 `' Z9 Y3 z
7 A9 H0 t, ~( t# U& H" J! @' L 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
- r8 o4 w% k$ G+ S1 @
1 r, y/ b* \5 s4 c) D2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
: C# W" ^( G" J. Q, ^4 E1 c7 a( q, q, T* I" w1 @ A
```' ]# g; |7 }+ T3 I
add_action('init', 'create_custom_post_type');
2 [, t/ o" P% S! y# ]4 K L9 N function create_custom_post_type() {
) k+ T% S! `& d& p5 }: `- V9 k8 g0 J: q6 } $labels = array(2 Z1 n6 _; S. q! R4 s3 c" N/ {
'name' => 'Site Wide Notices',* Z8 ]7 r* S& F( M
'singular_name' => 'Site Wide Notice',
! W+ v+ i2 w4 S2 T F 'add_new' => 'Add New',
3 a y, e8 ^5 i7 p4 a' p2 e 'add_new_item' => 'Add New Site Wide Notice',
: {) `! c8 ~8 ^ 'edit_item' => 'Edit Site Wide Notice',
% w# X) N2 u! i7 D* j 'new_item' => 'New Site Wide Notice',
' i# L) F' c' J9 b 'view_item' => 'View Site Wide Notice',. V' F- c6 Q# b$ ^
'search_items' => 'Search Site Wide Notices',
3 M6 u' \* I K" U 'not_found' => 'No site-wide notices found',2 i+ y! K( C7 i; G6 i9 Z
'not_found_in_trash' => 'No site-wide notices found in trash'( Z- t0 @2 i1 j& X; q7 L
);
. n6 z4 D9 N& \; R1 ^9 m v* {+ T6 Q" U w7 J4 ], {$ Y
$args = array(
" H# Y# G8 t3 Y. l; A 'labels' => $labels,
; I" I/ ?6 J: l: L 'public' => true,
5 i5 D' f# {3 X# x1 G. H 'has_archive' => true,8 I5 k$ j; p; w5 x
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
: g3 a' I/ }) @* a 'taxonomies' => array('category', 'post_tag'),
# ?, k2 O5 V5 ~/ y6 H 'menu_icon' => 'dashicons-megaphone',
) @. Z7 z- q1 u/ t 'menu_position' => 5,/ g, M% Y0 w( Z& c! t3 r: l/ ?5 \
'rewrite' => array('slug' => 'site-wide-notices')/ N3 J0 L' l1 S# @
);
4 J- T. q, m# C+ K. Q5 y
% u- S* J! J+ }4 K register_post_type('site-wide-notices', $args);
& H8 u0 y: w. X5 W }* s+ w3 ~+ V7 f* m; n7 ~ P
```! m3 h6 S+ D Z7 x
+ g0 Z9 N) x* _. Z
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
7 g& v& a& g- O8 D6 b' F J0 Z7 q/ a. M3 @! a
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:( L0 M3 P3 u2 d1 b A* S
1 Y* ]1 K s( l$ w4 g; }- e
```
8 @4 [' t2 E- N% K add_action('add_meta_boxes', 'add_site_wide_notices_boxes');$ p- M- z! q9 J( m2 a
function add_site_wide_notices_boxes() {2 F% X- o* M w+ }$ ~* Y2 e
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');2 L. ~+ h) }+ S1 ^! k1 h
}* P# X- ~; W2 k! p# r* C. F
/ ?5 H% S1 k' b+ Q
function notice_details_meta_box($post) {
5 B& X/ l/ ^# M/ |' g8 d% n wp_nonce_field(basename(__FILE__), 'notices_nonce');3 r1 S, z9 P6 p( U: y
$notice_title = get_post_meta($post->ID, 'notice_title', true);. q5 s- \9 o7 m' h& Y# M
$notice_content = get_post_meta($post->ID, 'notice_content', true);
" K, n! a9 p. m: w: c7 m ?>, k1 D2 {" A: R
<p>5 x9 h' m6 F. q8 W
<label for="notice-title">Notice Title</label><br>; H( ~. H1 i. w$ R0 p
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">+ u) O ~, e+ o0 ]0 H8 \
</p>
9 F% V6 H% \/ C4 E, { <p>
$ R# f* E" A' _0 Y% m <label for="notice-content">Notice Content</label><br>( m: E. t+ N- f7 ^, _; ^7 x
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
0 A: R$ o% U( s" L# q& Y </p>
3 D6 a- D3 s" B9 P" ? <?php
) B/ M) K8 F6 `3 H }
& y, @; R- [7 X0 g! a6 V9 L% Z$ S+ m; N
add_action('save_post', 'save_site_wide_notice_meta_box');
) _% h& Z. f/ R: F& C5 D7 d/ z' p) H function save_site_wide_notice_meta_box($post_id) {
* g; B8 e, Y( W7 q: H; Z8 s if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
9 t6 U' ^' X: ]! G return;
& A7 D% q, A- T; o2 Y if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
- g0 j2 f2 N2 Y, ^ return;
1 `6 C) u8 A( u, [0 ]1 v! U4 Z7 h& A6 y- @, o* N8 u) c- v# a
if (isset($_POST['notice_title'])) {
1 Z! e1 `, K2 a& L& \: ~ z4 m update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));: R) B( _5 t) n3 H1 A o9 x
}
) [" T" m& N' T1 R/ | if (isset($_POST['notice_content'])) {+ v4 @/ Z6 ]3 |7 }+ e
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));7 |8 h. E/ t1 I* T
}" K4 J- V8 u" M8 N
}. d+ K& M! e% @) |: \$ d
```0 f3 Z. z/ z8 X5 A
3 I( G$ I1 Q6 e4 v9 _
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。8 F7 |5 G: M9 w$ f
6 j* P1 p+ y t) K% p" d
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
3 K/ ^5 A6 ]6 X
& W2 S3 r9 t; b. e/ N0 w6 T6 | ```% { J8 ^) i& R
$args = array(
# e" m. @3 q$ r* | 'post_type' => 'site-wide-notices',
3 A8 ]& H1 b+ l' ` 'posts_per_page' => 3,* ~8 N+ {" W3 Q4 d5 ?/ A! I
'order' => 'DESC',
, i7 V! U, @0 |3 A 'orderby' => 'date'
5 d; B: {1 d# t9 V- L );, w6 B' U% i' S% Q+ `( Q. t, v- q
$query = new WP_Query($args);& Y5 `. O* W8 Y; U: c+ f4 P
if ($query->have_posts()) :
* |- c' P- `/ b4 h! w8 ~0 b while ($query->have_posts()) : $query->the_post(); ?>+ [- p W& U* x, l" L. {. I1 J
<div class="notice">" K" h K$ g' Y) [
<h3><?php the_title(); ?></h3>
; Y: ^$ z& p& j7 X2 h% m <div class="notice-content"><?php the_content(); ?></div>
; K& Q- ]1 `- |, T </div>- E) A% ~& w( A
<?php endwhile;
* B) ^' d* u# s( e/ E: D1 F wp_reset_postdata();
, Q1 x. U q8 j, a# R; \ endif;
; M' e5 j9 a3 i5 O% P: U ```
# r' U/ b% h/ @* i! x- c d5 E; d* z# @; b! Q3 v
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|