|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
1 o" N* \2 E: H, j3 f7 }3 M. g7 a! J, s2 ?. O
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
0 ?$ ?9 G4 K7 h( |
2 h! U. _$ h2 v以下是创建自定义插件的步骤:
( R. r( q" H" {0 |' u. S" O
1 u) F( B3 H" r$ L! v7 n1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:; s/ [* m+ {5 E! E" R/ y
2 F3 y& N" x. V0 {5 F ```5 i. Z' O- H( \7 I& d
<?php
/ }/ Q' b- ^$ l4 O- x* t /*; c/ a2 v/ T% k5 t& I" s! ?
Plugin Name: Site Wide Notices Plugin; b, T5 [' g! [
Description: Adds a new custom post type for site-wide notices.* o" C3 d% G! c. t0 \
Version: 1.0
% q( `9 ?2 l- f, } Author: Your Name
5 p# _+ A: [5 ~6 }) C; K Author URI: http://example.com! {7 r" ~! E% S3 E- [
*/6 _ @" I2 {8 q2 ~
/ y$ ?2 v: O+ K/ S, ] // Add plugin code here..., T% z$ Q$ y/ o
```
! E5 F; W9 s7 j9 a# F. N. \' p( T5 Y' N' Z
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
. [, |* B6 c' e1 T" f' {( P- e z" x4 \1 W: c9 u* G$ I
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
8 k3 S0 p; ]" n9 G V) e
' }% o- v' }% g% k) E+ ^* m- Z; [ ```/ C( q$ H: l" [" s, ]# S- ~
add_action('init', 'create_custom_post_type');
1 r% u1 ]! h+ L6 @' C5 Z function create_custom_post_type() {3 n8 g3 d6 ^7 Z, `# K$ O" N
$labels = array(1 h: I/ X( i9 j. q8 D
'name' => 'Site Wide Notices',
! S4 V' F/ D' Z 'singular_name' => 'Site Wide Notice',
4 Z8 y, l5 ^) d8 H* ? 'add_new' => 'Add New',
4 W& B9 i/ I {; V) z' Z' \ 'add_new_item' => 'Add New Site Wide Notice',6 t& R- V0 p, m4 D' \7 Z6 j5 Y& b
'edit_item' => 'Edit Site Wide Notice',; x$ x4 y3 t! }* g0 s( R# v- |( _
'new_item' => 'New Site Wide Notice',3 w- o& b1 H3 ]6 y
'view_item' => 'View Site Wide Notice'," u% B* ?9 K' W' U; Z( Y9 m. i' f
'search_items' => 'Search Site Wide Notices',+ M4 o8 B/ Q. I. c9 ^; S! S
'not_found' => 'No site-wide notices found',
* Z. |$ i: E: f9 D 'not_found_in_trash' => 'No site-wide notices found in trash'9 g/ G* L: i: q* y& ?% h
);
% R1 ~, C3 @- j! f3 s* S: M; O3 G7 f( o! [7 F! u
$args = array(. v* {- [% v8 a& Y
'labels' => $labels,
: C% X7 |" H/ {3 }5 @ 'public' => true,& }# X( _3 G. Q" C
'has_archive' => true,8 i' P& A3 k. l# D+ A
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),! o+ o, o- g8 M" J! A- f
'taxonomies' => array('category', 'post_tag'),) F6 [. K- D7 } H) C
'menu_icon' => 'dashicons-megaphone',7 K: S" h6 i7 w5 L
'menu_position' => 5,
: E# T& t: A) P' h 'rewrite' => array('slug' => 'site-wide-notices')0 {3 D+ |. {& |. r K# e' t7 ]# C
);
( y5 a* c3 v' A; `% T/ d! |& J, _4 _. c/ p) k7 ], U
register_post_type('site-wide-notices', $args);' |; O7 M$ k* p
}% }5 i; c/ ?. _* s% h
```
2 y; ^7 X, ^( r% O+ I
( \* `2 `1 h6 [ 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
' H) z U8 g$ ~
: F! j1 M9 c" }9 V# |8 r) [3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
8 R0 Z8 k* A3 V6 M2 \
& h0 c- _0 S3 @1 \" v3 h7 b4 G ```/ J" t& m4 x3 B r0 O3 u5 z6 J2 c# a
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');9 k& f( Y k5 z1 K0 j/ ^% g/ j8 v$ A# F
function add_site_wide_notices_boxes() {
( q6 Z! I' ]2 m) S4 ? add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');; [( b* l4 b+ G- K4 Y0 G
}6 W. S% w% t9 s X
( B9 A. u3 L% V U& i( P function notice_details_meta_box($post) {
# e) R7 q- U/ k2 \& M& }8 z8 U wp_nonce_field(basename(__FILE__), 'notices_nonce');" ? @, p+ o% z$ P3 h3 T3 b$ T
$notice_title = get_post_meta($post->ID, 'notice_title', true);
8 A! }$ O' |7 t8 X' m0 r $notice_content = get_post_meta($post->ID, 'notice_content', true);
, H. E# V2 h; z$ W ?>
) t% [0 P" L2 i5 m/ y+ W; j& W <p>6 u/ C! L7 v: q! H0 k) |
<label for="notice-title">Notice Title</label><br>
) j _, H* i9 \, u5 T <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
+ D `1 ~! F) y; i. {( C0 E </p>
$ U% A: E/ m1 e. i <p>
+ a/ Y1 l n: \" `8 c4 A) n5 }" p <label for="notice-content">Notice Content</label><br>
4 H+ d& `$ K( Q' Z3 d <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
3 U1 o& y G$ ?5 z* b </p>
9 n% K* d3 D) C <?php
( w+ {4 x2 d, w5 t0 R6 x' \" S }
& v9 M5 T6 U" V: U. r* x, A
- Z1 V; g9 A3 T6 @ add_action('save_post', 'save_site_wide_notice_meta_box');
. v/ F" T: i3 B$ m function save_site_wide_notice_meta_box($post_id) {! i+ j8 ~4 q' k& [# \* E* N
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))" O$ Z* G9 R+ K; h0 G1 T7 G
return;
. G7 Y6 s% i! K( @7 a if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
1 [0 Y6 [7 ~' C return;: s3 o) Z0 t. D1 b3 h
2 p! U3 O; v' q0 d( F
if (isset($_POST['notice_title'])) {( p: i! {% q7 a! h1 s, c0 k
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
/ H! j+ z& v( O7 k8 V1 v ? }
' g/ B v6 Z9 ^: O5 } if (isset($_POST['notice_content'])) {1 Z% E# R3 l' ^ y3 |
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
# [" |' w6 R' p9 J B& l5 C0 U3 T, e }* l$ p) |2 m5 c4 a5 w0 l( g
}
; T7 ]) i7 u. V; t" G ```5 e5 o. K) m: _) k# @) g: ^( h2 M# k
, f) `( F6 ^& u) _' S 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。+ p! u0 q$ X' l2 ~ r
$ A6 W7 U P, {: |
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
6 E8 M9 g+ V3 j8 W8 }& X* Y* c- A: l4 a5 u# b
```
( @: \1 d! ?) A" y3 O3 e( J $args = array(
; C) {) h& L& ]/ ^, k/ w0 y2 X 'post_type' => 'site-wide-notices',: r0 s5 ~% K% Z" A
'posts_per_page' => 3,& |2 L. g/ l! }
'order' => 'DESC',* F3 ^( ~2 r7 R2 o9 S2 @! r
'orderby' => 'date'
% Z8 W1 Z: j$ v4 t* {# Q );, H* k* G) V4 q3 l' S
$query = new WP_Query($args);, X% ]; F# a2 c2 N" Q
if ($query->have_posts()) :
& L$ m& n2 P: @. p! L8 M0 a J while ($query->have_posts()) : $query->the_post(); ?>
0 W1 X+ W# Z, f8 N <div class="notice">
|( A! P& Q# R! `( X' [1 c; p/ E <h3><?php the_title(); ?></h3>
9 q) @2 [5 b% p0 A6 o3 n. r <div class="notice-content"><?php the_content(); ?></div>
' \: _1 L1 |2 H' T </div>
$ T& _. L' A* f) G! g" Z- ? <?php endwhile;7 U G: {! J/ A7 y" O, ^
wp_reset_postdata();
% |- @2 y4 f& l. W; ^0 k endif;4 P+ \/ r4 w7 N6 V# G4 x
```
* {( D8 F! Z1 V9 v2 b L
: y: P2 f9 b' C& B& u 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|