|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?4 \6 f! c J1 ~+ Q) ]+ G
, ~9 Y9 [" `$ W+ U
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
2 ^0 B; c6 T# j6 Z7 H$ r, ]% s) _" Z& k+ `& g4 a
以下是创建自定义插件的步骤:" Q5 k6 }5 p( ^: B& G& @
% i# X& V% W* n5 v, L: Y1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:) z; B( j8 d$ \5 |) q
/ L- r# l* H# e9 W/ v ```' r3 _' b3 ^+ j1 X: Y$ R
<?php* M) B2 c1 P8 C- M r+ V2 i3 a2 q$ K
/*
- ~0 h( C2 w) g3 S Plugin Name: Site Wide Notices Plugin+ A* P; N" u' J ]. A( x, A5 Y3 _, j
Description: Adds a new custom post type for site-wide notices.
7 ]3 v6 q8 p+ p! Y# d Version: 1.03 q1 v$ f! I; ]1 X7 [* t. \
Author: Your Name3 f$ |. M0 C" P8 _' k
Author URI: http://example.com
! I, ]# b, u) s5 e */$ N# e) j4 ^3 O4 r5 j! H
! Q% F* L; \8 Q& x& G
// Add plugin code here...
& U& N5 e* K* {, b, S, a3 W9 J ```
+ h; B1 C, m! O. W W0 j9 E% n+ Q
5 w, c* y. Y3 y4 k5 W1 t 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
* t3 J2 i. v- `
- s# P! y0 E4 C) a$ \4 o$ K2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
' N3 e y, v' P- J
4 s5 k G/ N/ O' z ```: ?$ ~! j) `0 v5 P) t# b* |
add_action('init', 'create_custom_post_type');/ J; i7 a" O0 X7 ~
function create_custom_post_type() {
) j2 I1 q- b U, C: e$ u $labels = array(
3 q. h1 N5 {$ \7 B- n 'name' => 'Site Wide Notices',
0 H V& n6 j! R, V; a, u" Y5 l% O/ w 'singular_name' => 'Site Wide Notice', Z) x2 ~6 v6 a4 {4 T' \
'add_new' => 'Add New',
7 Y; X7 J0 ^; |" s& q: E# B: K 'add_new_item' => 'Add New Site Wide Notice'," r8 N7 C% k- g4 y$ h
'edit_item' => 'Edit Site Wide Notice',
& `3 ]( Y0 e9 |9 B7 h8 q$ m7 [ 'new_item' => 'New Site Wide Notice',
: L" V- S) o- ~. @/ ]! s- W 'view_item' => 'View Site Wide Notice',2 V7 p/ M! y9 I }. ?% c0 |' @, Y
'search_items' => 'Search Site Wide Notices',6 y r. ]7 n$ u- y- M5 a; P; x
'not_found' => 'No site-wide notices found',( N8 r' g8 G5 x' D- _3 C0 D
'not_found_in_trash' => 'No site-wide notices found in trash'
' H4 Y& C1 |: O% \, ^" Y' v );
, }$ G+ w, O* q7 u9 Q) W, A7 _( @! p" s
$args = array(
* f$ T' @8 k9 W" Z/ j% U, v3 | 'labels' => $labels,$ z9 M, ~# |0 I, Q- j: d6 ~
'public' => true,3 @2 a! H2 E3 v
'has_archive' => true,* T# j* U5 x2 v) J# E5 o' p
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
0 B3 q5 u# D3 [+ Q8 b 'taxonomies' => array('category', 'post_tag'),
0 q" p( N: [. j 'menu_icon' => 'dashicons-megaphone',( A( A5 h% i0 ]" v9 N1 J' L6 S5 U7 Y
'menu_position' => 5,
- `: y# b% |' z I 'rewrite' => array('slug' => 'site-wide-notices')
u7 J5 x5 C9 _3 Q( m* K/ l. I% t );
" k5 @' T9 v- j& \5 X/ G6 W. O% d- ]+ m. P2 i; K
register_post_type('site-wide-notices', $args);# @/ W/ m F/ o! N* Q! Y/ v- a
}( C; V$ X2 \, F* W
```
# e$ U2 o. D0 O8 R/ a6 H7 Q1 C; r! n! Z6 r* b* J
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
3 ], C( Y% C z% t( K) A! B. u5 Q5 A
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如: n: b' J5 O" N% a9 G* Z9 ^
0 [( M: H/ W- U7 X) |- l3 @- X ```
+ w/ X7 E+ U# ]" K1 A0 \" |2 b add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
5 J4 @" k6 m) V$ a3 l1 g ` function add_site_wide_notices_boxes() {
! H( S, g8 Z" x* J* e; r6 H add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
& M+ k" A1 m7 y" ^# Z% f- d }9 X9 p* f! v1 c! m
+ b7 s1 b- x8 p8 Q function notice_details_meta_box($post) {
0 U( x) @& t6 o' O2 c1 V wp_nonce_field(basename(__FILE__), 'notices_nonce');
, E8 V! I% d; N+ c $notice_title = get_post_meta($post->ID, 'notice_title', true);
D* P/ C' A @+ c( }$ y $notice_content = get_post_meta($post->ID, 'notice_content', true);
3 o% o. p. A) u u1 i; P8 ? ?>
5 _6 H f. A6 L" ~/ N" u6 I <p>7 i0 B+ }9 S! \( b
<label for="notice-title">Notice Title</label><br>$ N8 k; @% G0 E9 Q: e
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
" o0 ]$ ]7 l. {8 u0 t& N </p>
3 A' w# C" Q8 X% {1 [ <p>
6 @2 n5 x/ Z a1 q P: L# i. X- Z <label for="notice-content">Notice Content</label><br>
" j0 y9 f% w, |5 q* l5 ` <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
; Y% \" z: @# S, l9 Z2 Q+ J) z </p>& {6 v e9 ~& { H* ]+ f
<?php
0 ~# B6 ?( J0 c8 _2 @9 l }
- J* ?. d# l! f/ Q) U. J0 Q9 y' W2 C7 m3 k t/ R# V
add_action('save_post', 'save_site_wide_notice_meta_box');
( ]) S2 g' J5 h8 X1 x+ \# \ function save_site_wide_notice_meta_box($post_id) {+ J5 t/ @7 J* ]- p
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))). J4 V* c+ x2 {" s D
return;
: X8 @) y8 Y; r/ [# O% [: V if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
9 n% V: E3 F- M; x$ q return;
3 N; c i# P5 x7 _6 L& j4 O( r# a( `& @; f
if (isset($_POST['notice_title'])) {
& ^* y. O1 g5 U' T update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
, j- H. x# h# {1 i/ V }
; p" F/ z* g- k, Q, ] if (isset($_POST['notice_content'])) {
3 m( B. @9 v# O+ a( h9 ] update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
- j1 I1 Y& _$ E# \' B, Z4 f$ J }3 O' q. S! Z' {) |7 U3 _: G
}
9 |& d4 | ]' C& l; v4 w ` ```
( j' {" S) i7 a
: B" ]9 F* T! r5 b+ O6 F7 N 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。$ E L% Z' @5 z2 r. y
1 D B0 ^% m/ O5 o( k! z3 |! t4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:/ a' G! P$ K7 B6 d* O
B8 n+ ^/ c5 s: }: @% |
```
8 U7 s: E; F3 X& L $args = array(& v* c# s& I3 R9 J& B' m5 ~5 I
'post_type' => 'site-wide-notices',, M7 p5 p+ c& Y& s5 b
'posts_per_page' => 3,$ T" ~+ U4 ]% ^0 E( }! b
'order' => 'DESC',
+ Z: |5 B: W- c+ c6 Z+ j 'orderby' => 'date'. G/ j" z, s8 c6 K1 |& C' A1 n
);7 }9 q( D% o, y) J8 l) T
$query = new WP_Query($args);1 }) H% l: l& V8 N) h) U# U1 i1 \
if ($query->have_posts()) :' M$ X1 K. f* x) F
while ($query->have_posts()) : $query->the_post(); ?>* D0 a) Z% m2 N& U
<div class="notice">
+ G. Q: ^ K( Y3 m4 q2 C$ _( |! p <h3><?php the_title(); ?></h3>
9 S0 q# ~( W+ X <div class="notice-content"><?php the_content(); ?></div>/ z! B6 c" m- T; R, n' U
</div>
5 o6 B( Y$ D' K- L1 ?; m <?php endwhile;, N! w# W0 P& {) d' t3 ~1 z
wp_reset_postdata();
# M7 F6 C& x5 o9 g/ P3 u endif;
0 y2 Q" M% s0 n$ X5 o9 T ```3 v" g( x' X* Z, h8 Z0 X3 ~
& u. m/ x$ f2 G" G$ R1 W4 Q* o$ {# r1 L9 l 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|