|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
4 Z( n- i7 C7 \8 B( P: z& i
. R" W& @ W! }, V5 T如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。, j, J& ^1 I8 y! ^5 b, \
% W# P9 F, o/ ]3 i( d& f8 J( S以下是创建自定义插件的步骤:
* a/ @6 c8 o/ C5 t2 g% |* x* W' @
# d3 Y# ?4 F1 I; O- E- V; j2 g1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:5 g, O9 z7 R1 U( S% B
0 m: [8 E$ s' Z. j( i4 V& Q
```
4 o( ^" `1 `1 M, e+ K! I9 V, K <?php \( V# H+ B B- D) z2 {8 H# a
/*
' a4 l' o% X# N4 n4 { Plugin Name: Site Wide Notices Plugin R. k. x: M+ i: i" T
Description: Adds a new custom post type for site-wide notices.
5 _1 o- m, ]* L8 ^) L1 A2 N Version: 1.0' P3 Y8 U+ V& B& j4 M& P" o. `) _
Author: Your Name7 S+ ^# s+ E; c- y9 T
Author URI: http://example.com
& D6 V x6 P1 W: ^ */$ F) N3 [" ~% O/ Z8 H) N+ t' P
# y F% r4 a0 Y N // Add plugin code here...( x$ A+ d$ D& L$ P
```* l7 g4 I; Z! ~0 q/ z9 J
% e' e! f- u) g( C3 Q R 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。% s1 @ v3 O/ O% _
; Q& Y t5 Z9 K* m2 D8 C5 p5 p
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:& ?" Z G2 {) k- E' A' `
/ b/ n5 W) o( O( d ```
! |0 p! }, ^5 s0 e4 G' Q add_action('init', 'create_custom_post_type');
$ Z! w/ e% }7 ^ function create_custom_post_type() {7 E' e g# Y) i3 m
$labels = array(+ T t& d7 I) F& H
'name' => 'Site Wide Notices',
' Z# w: b; D, v1 n' M, n, D 'singular_name' => 'Site Wide Notice',2 f/ Z; ^0 X- a/ V
'add_new' => 'Add New', I5 w; g' a& D% w x$ W6 {( f
'add_new_item' => 'Add New Site Wide Notice',
' M$ h/ Y/ i2 p' q- v. L2 S! ~ 'edit_item' => 'Edit Site Wide Notice',
* J+ F6 y$ Q1 p3 |- @( [ 'new_item' => 'New Site Wide Notice',- ~4 H; i0 _) f2 s
'view_item' => 'View Site Wide Notice',/ R3 k+ f' v$ }5 ~1 `
'search_items' => 'Search Site Wide Notices',/ d; R/ V6 }& f8 I0 M6 T
'not_found' => 'No site-wide notices found',$ d- b7 b {5 w9 k* V
'not_found_in_trash' => 'No site-wide notices found in trash'
) @% K% H0 s/ p) ?* W );1 ~8 M) }- p0 y1 I
. Q$ R2 s+ W/ ?0 @3 k, z $args = array(1 O$ o6 J& O; Q3 z! F: H0 o
'labels' => $labels,& _" l$ p& Z. P w: R
'public' => true," [3 g5 i0 e) r1 ~/ i8 g7 _
'has_archive' => true,
1 l5 h2 Y# P$ h/ `) O4 c 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),* ]5 ` w9 h0 u2 j3 K9 K
'taxonomies' => array('category', 'post_tag'),- C, m+ b% ^2 s/ t7 O; u0 s8 n
'menu_icon' => 'dashicons-megaphone',) o' k+ ^& y1 A; W4 _9 A3 N
'menu_position' => 5,
$ w% J: d/ m; q+ l! ] 'rewrite' => array('slug' => 'site-wide-notices')
0 b7 K4 \- h- i3 r L! O' c5 r );
1 p$ C7 @3 ]& v2 [0 w: v/ d! Y# _0 M, ^
register_post_type('site-wide-notices', $args);
7 G0 c5 m( m0 S) r) h A2 A }/ m: s3 m# U, R" Y$ E
```# Q, n7 p6 `- Y
/ Z4 a; W5 i8 u- S4 g6 a
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。! @( Z0 R7 Q6 G& A: F& ?
/ ?, K' W( R6 Q4 x
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:2 y/ ?6 R- @; d1 d# j, ^
3 R9 E$ K* Y! @: k& d) ]" b ```1 T: n% Q3 [5 B# z" d
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
, k$ X3 y9 U0 m+ T function add_site_wide_notices_boxes() {+ R+ ?9 j' ?( J+ m" s# k
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');* ?, `" C+ V; \; {2 k# K
}
, S( g" O& y7 n8 {0 ` V& d( ?
( m4 E! O) }" q) X7 v0 o6 q function notice_details_meta_box($post) {/ n' y2 p/ A; e
wp_nonce_field(basename(__FILE__), 'notices_nonce');
* m. s% L' {. l0 m( p; i2 b! A $notice_title = get_post_meta($post->ID, 'notice_title', true);7 |# f8 ]5 E0 F3 Q6 ?
$notice_content = get_post_meta($post->ID, 'notice_content', true);" k& i' d+ \) ~/ l) t o9 k) _& S5 Q
?>1 r8 N; c# }& G3 C
<p>
$ [3 ~/ t& h" i) ] <label for="notice-title">Notice Title</label><br>
& f. G1 N" P5 r7 e% ` <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"> n- L% t! ?3 J- l& o Z' j
</p>
3 m% ]0 M9 I# d# a! z4 T* l; Q: d <p>
' {- \, \0 Q S% S& D( L7 U( d <label for="notice-content">Notice Content</label><br>0 ?0 _3 R# j0 v1 t( K7 m+ e
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>1 O: l* V! n0 P2 `+ `
</p>
+ N! g5 g K j: F! F <?php% x+ m& C1 O5 k. y
}7 x: ^. I1 g, H8 P4 z
1 J% O* a; G9 w( y* ~* m' ~
add_action('save_post', 'save_site_wide_notice_meta_box');
) ], w0 _% {2 t+ u/ j, y D( ? function save_site_wide_notice_meta_box($post_id) {6 U5 ]3 i, m) y
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))) N2 H) }3 {( z+ Z H4 J
return;
6 M2 v- p5 Q5 b. X7 h+ n i6 y7 B if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
" Y4 F; V9 P+ V0 F `* B6 ] return;+ Q/ C0 l- t- f, U) i
4 O: g5 @$ j0 {$ D if (isset($_POST['notice_title'])) {
3 i: ]& A1 X# i# I update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));8 c; \# b& u6 P! T& a1 v' O
}
: Q5 P# G4 Y. C9 w" G/ |7 O if (isset($_POST['notice_content'])) {
0 b u, U5 J% z' l/ R% G( n update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
7 E1 {1 X1 C7 s3 J. v# P }
" l3 t+ S3 i1 Y7 j( X! z2 E }) p" y1 C* C, [7 s2 a+ {' k
```3 j9 J% S2 W v2 t/ v/ V: a
) Q( k/ D. V4 W" t" D, j' I, M/ [ 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。/ [8 Z/ u+ k$ Y. r8 D& V
X! u, A. `: \) |# _4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:) g H7 m, D" M* u4 d% @/ {, q* o
/ f9 O! i6 L- k& t ```
3 X2 Z2 C9 t- D1 }- ~: @, y $args = array(
2 [. e. k5 K* C$ M/ x# q9 F 'post_type' => 'site-wide-notices',+ O+ t" i+ t3 R! f! x; @' |. i
'posts_per_page' => 3,( x" U( \& B. v, K$ }5 F, A& T% G
'order' => 'DESC',
N$ g- w r, z0 ]' m; O; z 'orderby' => 'date'; i# _ K! d4 F( B+ F' E
);
+ m0 C3 c) R7 H $query = new WP_Query($args);
/ W5 m/ l3 S. t# W! U- Z3 c if ($query->have_posts()) :
7 b5 V9 n" N/ E7 g" x7 @ while ($query->have_posts()) : $query->the_post(); ?>
, V3 l- t# X) i <div class="notice">
* m- B- k+ L" Z6 E6 A- t- ~9 ?2 z <h3><?php the_title(); ?></h3>
5 E3 l# g1 @! R5 s# D9 w0 K9 C; n f <div class="notice-content"><?php the_content(); ?></div>( [8 u5 }( x' @* h. @
</div>
3 J8 j' W- W R% K% d1 f% O- D# b <?php endwhile;
4 q0 S1 q" C) K: E$ w y wp_reset_postdata();
; G; u D) P# D: c7 I; C8 {7 R. C endif;
& x9 _. W. I: A ```4 N% s0 p" `: {9 F; G6 ~
* V0 _9 i7 U2 ~- s9 Q! F( m 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|