|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?1 l, r" T$ ?2 H) w5 c5 {; U
" I) `; E# f: B* ^/ D; i' ?
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。6 {: o2 E$ L a
: H1 m& v& Y% d- x
以下是创建自定义插件的步骤:6 T1 o- H& L/ h/ {
6 t' f4 d9 F- Q
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
# H7 ^, U; `* l1 n9 F
! Y; }7 P: }4 O4 ]2 W( ?8 V ```
+ Q9 U* v7 Y5 q: z# u e) ]: M# u& \7 f; L <?php* x* ?9 `; J0 A$ s2 y
/*
. M- u, S) S7 G8 @3 _+ q Plugin Name: Site Wide Notices Plugin
3 Z/ S0 w' a; }/ {, F+ k5 [ Description: Adds a new custom post type for site-wide notices.
* N5 n% @" q' \( ]: Z. I Version: 1.0
. m5 q0 a2 K; C. D/ }1 q' S% y Author: Your Name
% O- u- i/ V3 m6 m* o0 W Author URI: http://example.com
0 h! V) i4 K0 G! w0 w$ u- [& e */, v& M3 Q) Z- H- Y- L
8 M D) d3 B/ P+ j( p2 c, x8 E // Add plugin code here...' c9 r$ d' N, i5 ~, Z2 j) [
```
2 _7 ^3 v9 ]* m0 l9 d
@# c' v4 X# R0 V6 ~ 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
' J" d* h" \+ @$ b8 p1 M L5 X# m* I7 E* C0 k! r
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:, r. l0 X' N; x3 |) U9 d
1 v0 {" E2 c3 [1 I
```. k) d- L- W9 T6 I: `2 p! W' L
add_action('init', 'create_custom_post_type');( M' `) J6 L: Q- R1 |: [
function create_custom_post_type() {6 N5 D" b8 b+ a$ y& g+ y% u
$labels = array(* x$ X; a8 e* ~3 Y. n% I
'name' => 'Site Wide Notices',
6 S& \& n5 o! k$ p4 F* z7 H3 g 'singular_name' => 'Site Wide Notice',5 a0 C+ Z1 I$ ?$ M8 H( Y' q
'add_new' => 'Add New',6 F& E/ S2 v! X3 u; T
'add_new_item' => 'Add New Site Wide Notice',1 @) Z$ @/ B7 L W4 j) P
'edit_item' => 'Edit Site Wide Notice',
5 X" [- N+ T( _: {3 h' Q( l3 K 'new_item' => 'New Site Wide Notice',
$ G! C8 @: j: I ?* \ 'view_item' => 'View Site Wide Notice',+ B9 a2 S9 M) t; g
'search_items' => 'Search Site Wide Notices',
6 B( C- Y$ E# M+ ?; Y! I 'not_found' => 'No site-wide notices found',' g5 H$ P! Z5 [9 L' R) Z
'not_found_in_trash' => 'No site-wide notices found in trash'% [* J% t1 i- Q7 h s2 `
);; x# X" p* w* D
, K) J" M+ R/ n1 b' J M! p: \ $args = array(
, s1 ]) s: f# L4 O* m6 i m 'labels' => $labels,7 Y8 Y6 t/ q9 H9 y" m, U' ]
'public' => true,3 M$ n' A m2 ~+ j9 D' c5 \
'has_archive' => true,! P9 W& n) c2 b$ P
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
+ i6 G! e- _9 \$ H6 M1 C 'taxonomies' => array('category', 'post_tag'),! G; n0 Y: X$ L4 b7 ] [$ P
'menu_icon' => 'dashicons-megaphone', K2 A z4 i" S8 M
'menu_position' => 5,
/ }; }! F: {8 [9 R7 T$ `% ~ 'rewrite' => array('slug' => 'site-wide-notices')
7 k9 {: ^* o c );
0 d6 o5 _. Z' J* F
0 o1 b+ g% z% G2 i& s) T register_post_type('site-wide-notices', $args);# ]: V0 \) c) T. A. e/ Y% D
}
2 @6 b% \; N2 Z& i. [ ```
4 r, f- J' n1 _
7 P: B9 h9 C& Z, M 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
a) F0 I1 l0 {+ n! e
8 f& `& ]$ W2 n- }, _( w3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
) U- L2 r$ T0 @, u$ o0 P
6 I6 P3 N3 G3 B7 }/ z( X ```4 Y. o7 i3 v5 b& g I
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
7 e/ h0 q5 {5 X& i function add_site_wide_notices_boxes() {6 A; B1 N8 q3 e$ X L+ F
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');; b4 x/ E7 H! _. r; n J
}
$ b [4 c: U6 i/ g
8 k1 t8 M _( y0 F3 O- ^% ? function notice_details_meta_box($post) {
# y0 O" N9 T9 r {0 T' s wp_nonce_field(basename(__FILE__), 'notices_nonce');
# O3 H" ?/ {! | $notice_title = get_post_meta($post->ID, 'notice_title', true);
/ v( o! v# u! e4 t $notice_content = get_post_meta($post->ID, 'notice_content', true);3 L6 H+ ~$ n9 r, ]+ y
?>. o! h/ c; H/ x9 _7 r
<p>1 v+ T9 N6 H4 I; [$ n N
<label for="notice-title">Notice Title</label><br>& c( A3 g$ m) E' N9 @' r# D" T
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
1 G7 [& G2 E5 U </p>8 {$ O* x0 I+ i5 A3 j
<p>/ y4 ^' K0 O, q) @1 s
<label for="notice-content">Notice Content</label><br>
" X8 {7 @7 ~& U0 G U5 z; Z <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>6 H; q& Q3 u& f; b s% N: I. d' W
</p>( p: P+ f% {/ l& `: @
<?php! h, Y3 D& o) O* d
}
. n* j; s" v# k. C& i" e: Y
! [+ p& W; L# B- m% K add_action('save_post', 'save_site_wide_notice_meta_box');
8 }+ c. O1 }4 b! z2 g9 o function save_site_wide_notice_meta_box($post_id) {
- U$ ]' `: }0 K) y0 ?; G" {- ~: |; x if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
# }% E/ ?# h0 |" A5 y return;, c. U ?7 _2 O
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
/ @$ ~! z8 K- m6 W( \! Y return;
. O# K6 k; D& J& B+ _& E# H; n* J' ~
if (isset($_POST['notice_title'])) {
. y6 g9 I. x$ `, K: a5 B8 R7 c update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
/ @5 r% e4 X9 Z l$ K* [ }
0 R: w) v! S p _2 e7 E+ s if (isset($_POST['notice_content'])) {
" r' ?# s, e" h, t update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));1 P2 r" B4 D) `$ j" s
}
; ^+ y+ e: X8 ?( D4 K9 E0 } }7 q7 l9 p" `; B- B* T g( `
```
0 M3 S0 A- k& t4 h+ b# W
) L- u' k" E) N' X 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。) R" ^% ]& M c" L" `2 ~$ K& x( z/ I
. V8 E: o6 |/ d. ~& z1 ]1 |
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:; w+ c; C+ [) Z: B$ E
( }" Z, |1 t, t% ?
```
5 i5 @5 t) ]# J' A4 [ $args = array(: r" |/ f+ Q/ C5 h: K4 F
'post_type' => 'site-wide-notices',4 C S% ~7 g0 L" Y* ^7 w$ ?- u
'posts_per_page' => 3,6 l! b' t! }8 U: i
'order' => 'DESC',
' O; V% L" ~) l: Z 'orderby' => 'date'
0 n/ k. G. h/ J) ]% I9 M. e F );
6 c7 a# `) [9 C4 e X4 k7 |( e $query = new WP_Query($args);% M% a% L7 x: J g4 _
if ($query->have_posts()) :+ \6 y; i7 g% k: L+ \
while ($query->have_posts()) : $query->the_post(); ?>3 C% }' O) ~" A; i/ p, M! D+ n
<div class="notice">
5 u& s, O: P3 g3 e <h3><?php the_title(); ?></h3>& q; e% w, |+ d3 W4 D* T
<div class="notice-content"><?php the_content(); ?></div>
! c- @3 r! W" [7 z d* P </div>
/ Q- @7 |* A9 H; X) B <?php endwhile;, R/ f/ K' s. G" y: J
wp_reset_postdata();
! Q, B% G- O B3 B endif;2 n) g4 M, ?8 D i5 M" S
```
! e! }3 }2 k% D/ D4 R! T2 \& D8 |7 c* o) r" M9 Y9 U
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|