|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?3 h0 g3 G" M+ T# \4 j6 U! q
6 X8 \; _" E+ O3 A* B/ @如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
3 I4 z' r u1 m% ^" ~
# h$ f9 ?- `# |6 c4 V以下是创建自定义插件的步骤:1 a% n! h, W, \; v+ P
- @$ m8 Q0 k% }+ p2 P+ s1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:* r" r" n$ t9 T. \/ D6 P) b- G
. E) h$ M6 x0 J- D& o$ C ```
# A- p7 K2 {5 K) y6 F) R& g <?php
; t% D, F5 \6 ]$ d# V$ @ /*
) ~- P) c6 q9 ]8 J4 t Plugin Name: Site Wide Notices Plugin
. n& L% q, r# D8 p3 j# j+ r, P: `' S Description: Adds a new custom post type for site-wide notices.
) L P8 ?" A& [9 A Version: 1.0
( B* Q: Z2 y8 `' f1 v Author: Your Name. F0 O; L6 Q1 `$ t; m3 W
Author URI: http://example.com- `% t. j2 B3 Y; \$ @; o
*/
% p1 Y5 n4 I) j1 Z# L- T5 _$ {- v4 W2 Q3 ?' T0 A8 y; N
// Add plugin code here.../ A( R3 N c. w
```. M. p5 B! B! i: Z/ ]8 r: d# \2 e
3 M" k$ K$ p/ g# b z8 I+ h. Y 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。 v/ z, h3 H* S9 t) z, ^
3 T0 L5 a8 e @: V8 ]! V2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:+ ^; R8 I9 T+ K) P
* x; L4 u7 Q6 {+ J$ ~ ```
' D; ?" j/ Y- g& Q% y* g1 u E" {; V add_action('init', 'create_custom_post_type');
' R6 U C* J6 q, k function create_custom_post_type() {1 d& Z* }0 }+ O1 i$ f9 z; v2 Z& y
$labels = array(
o; E- o, ~0 q 'name' => 'Site Wide Notices',
& @9 d: Z' h; B3 O0 m( [( T 'singular_name' => 'Site Wide Notice',
9 R9 K: [5 \$ Z9 ~3 `) E- i 'add_new' => 'Add New',( }4 n& M/ e) ^2 }0 w+ W
'add_new_item' => 'Add New Site Wide Notice',' U [& d6 U) U& L
'edit_item' => 'Edit Site Wide Notice',
4 ^" P( {9 ~; y6 x- J1 } 'new_item' => 'New Site Wide Notice',% p' m6 ~& k0 r( s
'view_item' => 'View Site Wide Notice',+ @5 w: e1 f6 n7 f
'search_items' => 'Search Site Wide Notices',% y: v; d$ @% h9 f5 O
'not_found' => 'No site-wide notices found',
* G" n* I- ?) X& S% g# w 'not_found_in_trash' => 'No site-wide notices found in trash'
/ J- ~3 R+ U" w1 x3 C. q );" v" V9 l: @, g) j% A( i" V
6 n: M, r6 z ^# m! H
$args = array(- D0 M- P) u6 N3 t
'labels' => $labels,
4 ~/ D6 o8 \% I 'public' => true,6 _+ p1 ?. w9 W/ o; |6 w: [
'has_archive' => true,
+ [3 F6 K8 Y8 g; o/ W# m3 e 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
& m, v: n, W3 a. h9 y2 u9 }( s: V 'taxonomies' => array('category', 'post_tag'),. R$ F" ?# K/ E/ T
'menu_icon' => 'dashicons-megaphone',4 t4 L) F- J3 ]' k) X2 j6 d2 o% q5 m! D
'menu_position' => 5,
; f! K; ^- \9 Q! @) } 'rewrite' => array('slug' => 'site-wide-notices')2 [- Y* a: F, c% z& a4 c* o
);4 ~0 |3 U& |# B6 H$ a
# n# i, q. D7 p! R3 h
register_post_type('site-wide-notices', $args);
) B" b7 X4 c3 j. |8 N; E4 K }
2 Q m( a7 K3 x0 Z( b0 R ```; a" e1 x, R' Z" s
7 Q9 \! }7 @9 v4 ?
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。8 f: m( d f0 d) f" W; M
/ u7 V& U" b1 q9 e; f. I$ A4 b5 R2 d3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
/ L7 p# O- c4 ~. N z
/ `) C" K- ~0 C+ o ```' z; Q. H( `+ D
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
B( E( o2 X8 Z2 ? function add_site_wide_notices_boxes() {+ T/ _3 A) W* i! Z+ V3 ~
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
; h M1 [6 q6 F# u }
( X! U8 ^4 v; N9 \5 T# C' ]$ T
% s! X8 U6 ] v! y0 t) v function notice_details_meta_box($post) {
9 [' R- b0 Z7 h6 x, I2 N wp_nonce_field(basename(__FILE__), 'notices_nonce');3 w# M& L7 U0 U/ @9 v& q2 W. v
$notice_title = get_post_meta($post->ID, 'notice_title', true);# ]6 b1 A: k3 [" T3 U2 u
$notice_content = get_post_meta($post->ID, 'notice_content', true);7 m/ W0 [9 R3 a: c
?>2 P; { \6 ~2 h m4 l3 O- J# K
<p>
! _1 D0 b% n- o- I <label for="notice-title">Notice Title</label><br>
+ g% Z) G1 w) C4 p <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">) V9 V. s9 A! F5 k
</p>1 U& G7 n' _5 I, k" H/ @
<p>2 i5 r! B3 U1 [5 x+ G! i/ ~
<label for="notice-content">Notice Content</label><br>! `5 `) A! [6 s* S
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>5 `8 k! L: [5 ]# V
</p>
! l0 [0 H/ o5 _8 n- ~+ _ E' g; W <?php
# `. _, S: \7 j1 F( Z8 p# | }) ?" _# r2 @# m
+ q% @# w) c/ @( T3 x$ E add_action('save_post', 'save_site_wide_notice_meta_box'); s, x5 F2 e% l4 y1 d
function save_site_wide_notice_meta_box($post_id) {( \1 D: S1 u9 P' P
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))); I7 K! G' b3 j& d" s( K' d
return;/ \( k' b( E8 M% x( g+ V: f3 s
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
- T3 [7 _* M6 q/ y% X* r' D! [, \ return;1 P0 F* ?0 o( ]9 \0 a
* b( `# ^; k6 [
if (isset($_POST['notice_title'])) { T% i' q) T8 m
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));" q. {0 q6 V* Y% B& |$ z0 H, C
}4 ^" H7 U7 T" O
if (isset($_POST['notice_content'])) {3 f* W5 l- B7 X: N* p
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
- f' B- s1 G: p! L+ ]% k5 k, L }2 {" i0 T+ p$ F" Q
}
5 b- X9 U4 D, J! v) d& H& c ```1 u2 f! ^- O1 @8 D! [/ V7 t8 P
- W+ e% D3 @5 D2 G8 r' w
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
; I0 j+ ?$ d# h: _
o$ k+ S0 Y) ]0 W* @0 }1 Z8 }4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
* K; I2 o3 W2 ]; Y4 p
% v7 ?/ n; d- c& I* h, @ ```
P7 @6 f5 I# y $args = array(( S& h4 d+ e- E& ~0 A. i, ]
'post_type' => 'site-wide-notices',2 |3 D/ t; w; Z- ]- ]
'posts_per_page' => 3,
4 \6 @/ S- r8 t( n0 Z/ p 'order' => 'DESC',
* \# u/ X6 O( e; B# B4 ^* h9 w 'orderby' => 'date') P( @( ], U" C' m6 e& R7 \' Y
);9 C0 V, ^; v1 @ }
$query = new WP_Query($args);
- e$ Y5 m$ R! I if ($query->have_posts()) :* o+ I0 d+ f' A. p" O
while ($query->have_posts()) : $query->the_post(); ?>$ N6 i) `7 p0 t/ J
<div class="notice">
2 W1 D+ Z0 u x: a <h3><?php the_title(); ?></h3>
0 [$ {+ T6 ]: ~5 A) Z <div class="notice-content"><?php the_content(); ?></div>
9 Y& _0 T, y' t# T7 V! q </div>
- x0 K: c* T7 |* Y8 s3 A6 M <?php endwhile;
8 C9 R6 q$ F9 t1 \: T' x wp_reset_postdata();
9 q8 H# Z% {( y! f endif;3 x4 h1 k, s! d* Y6 I/ O: S2 G
```. u8 S4 U, q! k4 @
$ r" V# P. p; w+ a. g
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|