|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗? {$ p% L4 i8 F* S
$ Z% d, W/ k, q
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
4 p" G _" @2 ?# N9 c
; w' l- O' r* @以下是创建自定义插件的步骤:9 d$ [# B- S; Y, r6 ]
6 _6 S0 y0 V; z1 J; O1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:( R$ w% I; V( G% Z7 |5 p
, g r% A" j- }; j* F5 u9 R4 i* l ```
& b* f& g( N% b) ^/ Q9 \: [ <?php
& f s+ q1 A; G) U7 Y, c- w /*- o1 }5 G3 l* f W# N( M, d
Plugin Name: Site Wide Notices Plugin. y1 |- Q9 l% d) N
Description: Adds a new custom post type for site-wide notices.
4 q, T. {! z# ?3 u' X+ X Version: 1.0
7 t1 W5 G* y) r! k Author: Your Name
s- Y1 G; X$ d( P0 u Author URI: http://example.com ^+ C6 S) P- ?0 q5 Z( Q0 V
*/- C K; I9 k; z0 S7 t
8 ^( P) B+ W4 h7 f' ^ // Add plugin code here.../ G+ K* p: m' `# y1 H' p% c
```
' }/ p8 P( J$ Y/ G; Z, M* Q' r" e9 B, ?. `$ L! m, J
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
; f( m' t' \, O1 D/ s' A" q& s( p& C+ r( u) ~
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
& ]: t+ b# I2 m0 ^9 Y* W9 D5 b
5 M8 T/ n# {: f( i5 p& n ```3 X+ n1 \( V# i+ G' L
add_action('init', 'create_custom_post_type');
7 S |' s8 h$ h0 B. m+ U% ], ?( X function create_custom_post_type() {
' P2 J$ v8 D6 \ J3 F5 C4 { $labels = array(9 z z1 Y4 q: c! `, j; l: w0 A0 J( ~
'name' => 'Site Wide Notices',, y; q' l3 z# b9 t2 l- S
'singular_name' => 'Site Wide Notice',8 K4 x& w1 M- a/ P5 [9 O" U: b4 a
'add_new' => 'Add New',% p6 B6 D1 d$ G# n" i: S# R
'add_new_item' => 'Add New Site Wide Notice',: ?0 g3 w. e* s( {, ^
'edit_item' => 'Edit Site Wide Notice',& h X( O+ Q+ g' g2 h# }3 X
'new_item' => 'New Site Wide Notice',
, R5 X- D, j' {! { 'view_item' => 'View Site Wide Notice',) D$ s6 G3 G* e p2 e; _
'search_items' => 'Search Site Wide Notices',( \2 ]' g p: p( J# h [% z4 F
'not_found' => 'No site-wide notices found',5 R9 C- D6 E7 `1 y4 `
'not_found_in_trash' => 'No site-wide notices found in trash'
( s8 L1 v% j4 N, r L0 c );. U7 f1 _0 n' c. W( o4 `
/ u8 i: {/ K( U. |/ h' n& W6 K
$args = array(, V5 d! p# t6 a* B: W) ]/ Y
'labels' => $labels,( W% k7 l( ~+ |1 H) T$ A
'public' => true,
8 J( y" P" Z3 f" T! t c: u 'has_archive' => true,9 n0 B; b0 C3 |6 I* @5 i
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
7 t, @2 y" I) M, Z8 L! f 'taxonomies' => array('category', 'post_tag'),' |6 y1 k5 U8 w, X, I( C: T
'menu_icon' => 'dashicons-megaphone',5 E& N4 [3 U9 j- U* P
'menu_position' => 5,
6 e7 I' e7 V. y, Y4 _ 'rewrite' => array('slug' => 'site-wide-notices')
v8 L- i6 |2 m; S) R );' b9 B4 W9 Y& C% c8 c8 l% X1 x
u; I9 G/ B# M( E* Y
register_post_type('site-wide-notices', $args);- F4 Q& ~# u7 z. T1 B' R( V8 h
}
* w9 j. v* ~1 D4 ?0 B ```1 T0 n8 n7 K* l {- x
: c! P7 z" K ]0 A 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。4 G M* u# ^ D. G# Q
* p; S# e. T1 y7 T3 Z3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:% ]) ^- B; s8 a! c' w
. k# }. s' P) {# S% p- E
```
$ \3 m3 _1 z* J1 U1 j! F4 r add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
" J0 Q, ~- l; Q: y6 S8 t5 s function add_site_wide_notices_boxes() {
3 ~3 s7 V& T: ] add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');& e, M8 i- S. L; s
}
5 {& a; m8 i/ y) U& g
# z% @* S, `% \, I; R function notice_details_meta_box($post) {
' d2 E" s3 g, i( J, g wp_nonce_field(basename(__FILE__), 'notices_nonce');* B( P# @3 ]7 c+ u7 v( _: T. F6 S
$notice_title = get_post_meta($post->ID, 'notice_title', true);5 z9 k, N `- A7 q
$notice_content = get_post_meta($post->ID, 'notice_content', true);
% k0 H* D6 u( F! d* M ?>3 f) L! L# R( b/ w
<p>! a/ R. M. ]0 [# w9 ]/ p
<label for="notice-title">Notice Title</label><br>
9 G* a9 Z# G; M9 `; O <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">2 H2 { t8 N& B& S) T* \3 ~
</p>) p5 L5 y V0 A1 C
<p>
" b1 J' w$ D. N <label for="notice-content">Notice Content</label><br>' e6 U+ A5 v' I) z& C0 _3 `0 X N
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>. M. O/ l4 e7 p. \
</p>1 J, O* l( P. H) v5 U1 O
<?php
# I/ Z5 s+ l. i* A }4 U4 G" a, p- K7 v7 R* Z8 h& N
( j! |/ v+ V/ [3 F4 ^ add_action('save_post', 'save_site_wide_notice_meta_box');6 V' \, T2 J; m2 y5 A
function save_site_wide_notice_meta_box($post_id) {( l3 Z( f9 U5 y( W, y1 B! a% X* [
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))' n- p9 o5 g- Q6 R0 v
return;
+ Y& g/ w# L& U+ [2 }0 k if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)9 ~5 I- n+ g4 N/ j7 r" N! i
return;
% S0 k5 F2 a | ^. W
% N( h( b8 y' R8 o: i if (isset($_POST['notice_title'])) {. T, c* t' h9 @$ }- W, b9 \
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title'])); X4 ~) @' u/ s" |/ V2 e, s
}
7 Y* H3 M4 `' {6 H if (isset($_POST['notice_content'])) { H9 i+ v7 O0 y3 T1 L
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));" H: R" [- B" k: u0 t6 R% ]; v
}
0 D" r- q. H. X, ^& B# w }4 y, v6 n- ]) m! n; L% L9 O# m
```. M4 {: @* M, Y. V: w) G3 S
: f3 u0 A( {0 E" i( b 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。7 A/ R$ `) l% R+ R2 }# a' f- p
5 s$ W+ e* z% r, B) ~$ L8 W# q4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
6 H# X/ \% h( s+ Q( A/ G7 b' _; ^3 l/ V8 X: o; c' o3 q6 ^) r
```4 v3 i6 w* Q, Z+ R
$args = array(8 C" J4 p I6 T: F- `* h- ?
'post_type' => 'site-wide-notices',% i6 \. {5 B+ D: Y; v2 ]) O( _
'posts_per_page' => 3,5 }8 T# _, u* ~) L! I
'order' => 'DESC',
" `, [/ p( W+ z" n6 a+ O" y 'orderby' => 'date'
- V* a# X; m/ a* u9 y );8 E; }- I1 e' R* Q$ a/ y- Q5 D
$query = new WP_Query($args);
" Y/ g4 S* }$ q/ e* Q x if ($query->have_posts()) :# {* g' M+ ~: L
while ($query->have_posts()) : $query->the_post(); ?>
* A4 H* W0 n; z+ y5 }$ e/ G& ^ <div class="notice">4 `9 q4 ]0 t+ l8 v0 X
<h3><?php the_title(); ?></h3>
* h9 v |; n% p <div class="notice-content"><?php the_content(); ?></div>
^" _7 r r# m" Y </div>
; p+ n' s+ @+ _" \ W. F$ ?+ G& | <?php endwhile;3 S8 i8 s3 x: _/ Q' H
wp_reset_postdata();
/ h( r+ h' Q- t* F$ v0 k7 e# k' M endif;4 }3 O0 K5 U% n& T
```
4 B# @; ^) t$ ~0 O4 i
1 X4 |# e8 N! `! s0 ^& f 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|