|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?, u( k3 \* ~1 P5 d. }* [
, Z4 x5 q' y! G- x如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。3 G+ |/ `9 P4 x3 m# l/ r3 l& E2 ?
( a( e c* l5 {& r$ H$ S
以下是创建自定义插件的步骤:
8 x! I) A& N! Q9 G' C3 n R5 o: Q, Z7 R
' @# K9 [( I* l& `2 } ]9 E8 g1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
3 m2 ?4 K# e- Q3 @' Q0 T% T! g" a' o+ A" A" @2 p, F5 N9 |
```8 l! I" m; A4 S" C
<?php9 u( Z, ~- E7 T1 d4 g1 M
/*1 H: T# F/ r; U
Plugin Name: Site Wide Notices Plugin; E$ t( @( f- i5 s% L4 X
Description: Adds a new custom post type for site-wide notices.+ v6 `# J7 v) j& N
Version: 1.0
$ E' z# V1 w1 |+ e0 W# n# H Author: Your Name1 a+ s! m) t9 X2 _7 b
Author URI: http://example.com+ K7 i$ N0 Q6 L5 m6 p9 |
*/
3 F; e) p6 ?0 k& s5 r% O/ u( d! P
$ y: C4 n# [$ C: L9 s1 O // Add plugin code here...
4 k6 K G2 g2 r* V/ a2 q: ]9 A ```/ S, v a6 u c! I) G6 }4 @
1 I2 R& n8 L1 @0 u) O( }: g' s! }
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
% H5 B9 g7 A0 W8 W% [% d& Y7 |# G) I7 Y6 f
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:, ? u0 e! F5 A1 \
: T5 c/ V2 I0 `6 \7 @8 \
```5 a1 r3 w2 E8 p( ^. q" l5 V
add_action('init', 'create_custom_post_type');! P4 `& E$ D1 ]1 B. A! v
function create_custom_post_type() {
2 H1 u# J) ] M+ ?4 `* M $labels = array(, P0 z; z% X$ t6 P1 `+ {
'name' => 'Site Wide Notices',
2 d& F0 Y7 ?1 ]. B% l+ y 'singular_name' => 'Site Wide Notice',% s% X( d7 h |: t! e9 q
'add_new' => 'Add New',
& g$ [+ i4 P% [8 c 'add_new_item' => 'Add New Site Wide Notice',& Q; I' g. }" T& O+ _9 p3 ^, l2 R
'edit_item' => 'Edit Site Wide Notice',
0 P/ S" W, U9 w6 {2 v 'new_item' => 'New Site Wide Notice',
( \ S b0 Q5 M& k% m3 M 'view_item' => 'View Site Wide Notice',. K0 k& b X8 Z+ v" z* s
'search_items' => 'Search Site Wide Notices',; D" c, {- T/ C0 I# i M
'not_found' => 'No site-wide notices found',( ?- W/ }( K: B, ^6 f: R3 G
'not_found_in_trash' => 'No site-wide notices found in trash'
, N8 u4 I9 B/ g );( |2 d( p6 [3 D! \; H
z: v0 G- q ]! o $args = array(
" p; S) ?9 q/ ?, M2 L C 'labels' => $labels,3 R% e7 |+ K$ u& y% X1 [
'public' => true,! H; s5 u5 [; y# ?7 q
'has_archive' => true,/ a& z, N* Q( i0 o
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),8 o8 H; h2 q4 J
'taxonomies' => array('category', 'post_tag'),2 r6 L/ ]0 ^ S9 U: ~
'menu_icon' => 'dashicons-megaphone',
9 O/ Z8 I u( R# ^& p0 c 'menu_position' => 5,- N7 `( f8 G( ?: ~( D, m! |
'rewrite' => array('slug' => 'site-wide-notices')
, F& {, O5 \5 y) U+ Y' { );
& S3 g3 c2 h8 F8 f
- O+ N* X( e- _; Q. `% L register_post_type('site-wide-notices', $args);# u# K4 ]! x- \& Q
} P7 s3 w2 i6 b7 z. E6 F( Q X& l7 M
```* H/ N9 V5 I/ W
0 H! _( V- W% C4 S 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
. [, w1 ]# ~% e- |% b
( X6 Y4 k* o9 U: N0 Z" B/ ?& h3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:: e- r7 X# w0 ]: \
- z$ o6 \ g* w9 r8 i- r! @ ```2 L5 W" q0 D% _8 i4 V9 v
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
' U; Z) W# E" Q function add_site_wide_notices_boxes() {
Z1 b* \4 f6 ~, H1 d$ _ add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');8 i. B6 \$ t) T/ a' E) X
}
5 t7 f8 k9 w! M( ^' C4 a' ]7 }& g1 j) ^* R- S- T' m& M& |+ X
function notice_details_meta_box($post) {
6 K0 s# C; Z( o k) R wp_nonce_field(basename(__FILE__), 'notices_nonce');& |( R& \5 A' o% {& l6 }) Q" I
$notice_title = get_post_meta($post->ID, 'notice_title', true);) i: [+ K' ?6 e, _! z
$notice_content = get_post_meta($post->ID, 'notice_content', true);
1 M/ P( Y" Y( J2 I ?>
x4 U4 I: r0 e& x/ s1 K/ }8 n <p>
; U2 n- w) \, b }$ A- | <label for="notice-title">Notice Title</label><br>
k6 m1 ?; V* A* }* Z' m3 W, j7 C) S* I <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
% C3 A) H+ n! F4 L0 A! ^ </p>2 v2 a) n+ E$ b! {2 @
<p>% y% g5 h+ l0 m: m' c% H
<label for="notice-content">Notice Content</label><br>
1 v1 m( m4 l( W2 U/ [' e" D. H <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>! Y2 a, i& Y* ?( T7 M. K4 y
</p>
/ p( b$ ]5 S8 t6 K. _5 ?0 q <?php# e' M7 c4 L( j6 a
}
: }% K; K# w# X- _
, \7 w8 n+ Z3 C! r, i add_action('save_post', 'save_site_wide_notice_meta_box');. j3 S1 a n( a& m3 D M" k: i
function save_site_wide_notice_meta_box($post_id) {8 M7 Q7 `% D/ _9 K
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
9 C; n Y+ d5 L; F+ I$ B return;
4 T3 }9 O" L+ k- \: n if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
, o: P' ?5 \% t- B4 e. {5 G5 N8 h return;7 |4 {1 w5 s- z! r4 \& m8 Y
; A! A3 j. v" w. O' g! ]
if (isset($_POST['notice_title'])) {
; u# m1 C4 ?5 b0 y G update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
/ U. Z* ?4 S7 T4 I% @8 o }
1 @. F. l% N& u; A if (isset($_POST['notice_content'])) {
1 e i3 E. O8 U. N, D4 W update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));- C3 o+ G1 b2 e c5 G+ S( a% M
}: X- h _( ~8 B
}& w u2 t2 P6 K5 z5 e3 V9 ^/ V
```0 [" e) P5 k/ j- g' m1 R7 `
/ o/ R, s# ]1 ]. r3 q6 B7 I- E' S 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。$ {. a, N4 H7 r* \ _
; a; A+ K9 o7 S% f; x* x6 s! ^4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:6 ]& q- X4 w9 Y2 l, m; C7 `: @3 |
& B3 @% |5 y$ [$ a0 m! S9 N ```4 Y9 o1 y3 r7 B, G
$args = array(
1 m) Q7 M! u9 h# `7 R2 ` 'post_type' => 'site-wide-notices',
; t! A2 q9 O( j) f. B 'posts_per_page' => 3,. z4 v/ o* b5 X" j: \
'order' => 'DESC',, E/ Z0 y' i/ M! r* U
'orderby' => 'date'
8 U( W3 o: x# b) v );
# R. |$ {9 {2 M $query = new WP_Query($args);+ N) X1 c7 b$ @& B R' w
if ($query->have_posts()) :
6 _1 W. a U P% q6 |) b9 J while ($query->have_posts()) : $query->the_post(); ?>
1 g) a4 X2 M) z. k+ _ <div class="notice">% m# e5 D7 B5 q, |; m
<h3><?php the_title(); ?></h3>
+ k" c( D* E8 w3 Z2 a( N <div class="notice-content"><?php the_content(); ?></div># ?7 ~5 G; o4 _! R
</div>
- T5 ~: o+ G: ]; k9 m8 e3 _( F <?php endwhile;4 E8 Y' t4 L' P% F x. i; m
wp_reset_postdata();
5 l, J0 ~+ [/ J0 H1 G2 C endif;8 P1 z& q) v5 V! |. w2 j$ |
```! D; _/ N; C# f
, Q/ x" a5 b' { k 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|