|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?. @: s* [$ ]3 V4 P& ^
( P1 @; S6 b0 U. `/ h如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。( O/ p" ]" M4 @# y8 _ d
& E/ J9 |' i2 u! k' Q. v以下是创建自定义插件的步骤:1 C6 E& n0 \) U- d
* q' U% _7 W6 R0 ^+ ~' _3 u1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
. l+ c1 Y' F/ J$ ~5 T( ~
, u4 R$ F3 Y; d* ~( T) e+ M3 d ```4 b& C. R9 ]' A
<?php
) m! }6 _6 y5 ]" j( ~8 E /*
) _, l' C& F: H9 g& h Plugin Name: Site Wide Notices Plugin" U% p0 x5 f4 ^# D. k+ S
Description: Adds a new custom post type for site-wide notices.
" s6 E6 A* v# T Version: 1.0$ q4 T$ U4 T& c+ i; ~% n Q
Author: Your Name
4 n4 n% {3 N4 j$ D1 Z6 d Author URI: http://example.com
H1 X9 g' V" A( z( R8 ^ */
7 a. [' ?+ P' J# y" R7 I
( M5 a3 A/ g, G+ H+ K+ O // Add plugin code here...9 z( ]4 @" Q. F9 u
```. {4 \4 W6 {* Z! J3 U5 k q% ^
A" i% L& j2 Q* i' @
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
0 V% j7 t. R3 f. U2 O# V8 j s) |8 E7 t# @$ U
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:* D& R2 T/ H" k* R
/ J: t; R( \ E6 r( l4 }
```* ]2 S3 R* r" I/ m6 i" u, d, g
add_action('init', 'create_custom_post_type');
9 p: f, m) A0 N6 D function create_custom_post_type() {
; {' F" c- l3 {' l# a $labels = array(& E3 V4 `5 s% r% q+ K3 e
'name' => 'Site Wide Notices',
9 z$ a: y3 O4 u 'singular_name' => 'Site Wide Notice',
5 ], R( }3 P9 G! f9 s8 J 'add_new' => 'Add New',
, r. y8 x# m1 p; h 'add_new_item' => 'Add New Site Wide Notice',
1 w$ H* K7 \. q2 v 'edit_item' => 'Edit Site Wide Notice',
2 q: O! Q \* L/ V 'new_item' => 'New Site Wide Notice',( h( m+ `" g, [% {3 \
'view_item' => 'View Site Wide Notice',2 l; Y" k% v& }% \
'search_items' => 'Search Site Wide Notices',2 h" F0 N, A4 c, z& z. B
'not_found' => 'No site-wide notices found',; ^% m3 n( M. b8 {% C8 b" l
'not_found_in_trash' => 'No site-wide notices found in trash'7 b* C7 Z6 z" P2 z
);7 Z5 ^" t* S2 Y( Y9 w: X( j
- M0 l' z/ J& T
$args = array(& d" g* v; M8 O- h9 I( P2 o
'labels' => $labels,
/ G3 v+ c6 j2 Q/ k6 s" w! _ 'public' => true,4 u1 @9 r X& }
'has_archive' => true,* H& `/ m. c$ Q9 J! F
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),0 L6 g# s( W- r- w! K' ~! O7 \
'taxonomies' => array('category', 'post_tag'),
# K K9 `1 m6 ~; [2 C& ] 'menu_icon' => 'dashicons-megaphone',
: k; ]$ Q. K7 J5 E5 h 'menu_position' => 5,' }& r& w1 O6 N/ u5 E
'rewrite' => array('slug' => 'site-wide-notices')
0 n" I+ o; `) z" p- u% S );
; m* v; }% _+ A, |0 X' W, {1 w4 R6 d5 H- v
register_post_type('site-wide-notices', $args);
3 J: I4 L6 h' D2 s }8 }0 G3 R' [5 a, ]7 N
```
3 X4 j$ I0 H2 N' ?
% o( K: C' y2 W" }2 A& I8 S4 R 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
) [2 M2 {9 F1 }1 r8 V# f' F2 N" w, T: c
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:7 R, U0 `8 a+ A. M7 p- d
! E# ~ t' O7 ^) q5 V
```
( E0 k$ H) [7 a add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
/ A9 i' p% F d function add_site_wide_notices_boxes() { T- u$ z! l, I2 t5 a" D3 l9 b
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');$ x. H' L7 Q' t% x6 o% W
}
! p- e6 p1 t# B1 k" ~# V( k
" J& S2 Q7 w* ~- t) I8 r, t6 h( m function notice_details_meta_box($post) {7 P, {% J2 d3 [$ W6 |, X
wp_nonce_field(basename(__FILE__), 'notices_nonce');3 t# C! U0 l4 W) C4 w% w
$notice_title = get_post_meta($post->ID, 'notice_title', true);
) r ], J9 }$ ~( l) A0 K $notice_content = get_post_meta($post->ID, 'notice_content', true);3 ]- i$ [7 {/ K) @. F1 P. J: q
?>
* B( d% {3 c! U: a L! }# t <p>5 z9 T% }7 N) `* \% d& Z: r7 s+ r
<label for="notice-title">Notice Title</label><br>, i9 z( E1 k" s% K
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
; v3 {8 @7 ~! y7 ]- m' \ </p>
, Y W1 K" e1 ?; }$ @) W! l <p>! r& L3 Q1 J% d" U% v" w
<label for="notice-content">Notice Content</label><br>0 v( i+ f4 ~# i# a8 x
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
& j; |, J" k0 b+ O% I! G' V </p>- H( k' O, o1 H4 o5 C7 d
<?php
! ]6 t+ n6 L4 D* s+ r$ M8 X+ p S( D }
4 {0 D* R# G! Y- {: S8 F. G. V2 M( |. `" r$ I- L
add_action('save_post', 'save_site_wide_notice_meta_box');
4 _; E) R, d$ i function save_site_wide_notice_meta_box($post_id) {
8 ~& ^3 u- ^3 E. b2 `* W* r if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
A3 T0 `( Z+ A* v [$ h4 g return;
" C9 j0 ]" s. p3 r! \- G if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)* \" ?/ @# T" W) o# j) N& I6 P7 O
return;
2 | z( s+ U/ d9 C1 J: B9 x* H3 d
if (isset($_POST['notice_title'])) {
$ `: `# E2 J' `& Z/ a8 n" s( L0 b& ^0 ] update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));+ z; f7 k" A& k* W
}
3 `+ W4 ?! P! O$ z. d if (isset($_POST['notice_content'])) {
: y# E4 j: }( s% ~3 ? update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
/ ^$ ~" T1 z3 e% l }
2 r; X9 u5 @( }: q4 f }+ u, E) P; x3 L( H( z1 f, p3 z
```3 q% {! w6 f/ l" Q1 ^
; |) ]6 U3 C5 X1 D( z( e4 ~! T
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
( e) Z% U% V5 O' S/ j% J
% Y7 e" B) c$ S0 w4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
d P/ b0 p( |8 z: g; F* A) B5 t" p$ ~
```
, t* @8 B9 }" ?# i, h% c $args = array(
1 u( L" p6 |( V/ Z2 M" G* ?$ E 'post_type' => 'site-wide-notices',# B# I. V! C' r* h! n) r
'posts_per_page' => 3,
9 D, g* A; ]5 \6 A. [' `! v 'order' => 'DESC',2 Y6 ?* W8 T0 o$ W7 i ` [4 Q& K
'orderby' => 'date'% F: C% S1 M( B; [5 u
);
1 ^ R5 l0 _. X/ d% I $query = new WP_Query($args);
% j2 Y+ z" C) B5 i1 R1 }# j if ($query->have_posts()) :
' h( Z! j) E5 P' J& {6 w while ($query->have_posts()) : $query->the_post(); ?>; P+ i: U1 o4 A7 Z4 g
<div class="notice">
# r) f1 \' ]& j; w9 g <h3><?php the_title(); ?></h3>
! z, R3 k# F- }9 @ <div class="notice-content"><?php the_content(); ?></div>
V" z2 ^: K. w* H4 Q& L! Y J' E6 L </div>
) `6 P+ q F% D, u0 E" y. A) S- ] <?php endwhile;
. z2 U, T# m+ U1 i, Q- c wp_reset_postdata();$ g+ {% ], }. k
endif;
9 v5 j) _: y7 _ ```
0 R% A0 L$ b& G/ @0 r; e
" `! ?$ u- X: q5 e 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|