|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?& \. ]6 d6 _% M5 U. k* B# J. F
: ?( j8 b' Q4 B% T' Z: E1 `: U如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
J. t P. m" O$ ?
( F5 o# V' l2 u* _以下是创建自定义插件的步骤:
" t- ^- [) D0 ^, V1 L2 o3 D! K) a h0 d* W; t5 z! ] ^" Z/ l3 E
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:$ e" h. [% j L8 {
/ H9 N+ U& [1 G
```# Z7 q4 a: A. k/ Q4 t
<?php
6 E7 P c# ]0 i {/ U1 s/ r /*
" F/ X, P7 b3 X/ Z4 c1 A4 [) j3 M Plugin Name: Site Wide Notices Plugin
+ d o) I! J8 x+ x- R3 M: |, v) G Description: Adds a new custom post type for site-wide notices.+ @5 ~1 \9 O8 G; a, h8 L8 T
Version: 1.0: |8 f3 A8 A' z. m) P! P
Author: Your Name
' ]8 y2 E, _4 l0 e+ \8 m Author URI: http://example.com
( [. ~2 D+ @9 F/ v$ H1 g/ J */
, v) ~$ p6 y# A* A
- d' N+ I7 I) a0 y+ k% } // Add plugin code here...
! _7 z2 w! {: K; O ```
7 w8 ] l# D- k5 F1 ?% j( R' J( r0 w7 U8 g! d Y( k
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
# z7 k9 W" f' l0 G5 f0 Y8 l1 P! B9 x# H5 G2 \# ^8 J
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
9 B8 q6 q( k3 t4 N
U: X+ b8 w7 i+ r" A4 s; O ```
! \; e0 g& y% o! Q8 F. x n" \% Z add_action('init', 'create_custom_post_type');
3 N( `7 p. X l. m' R: Z$ V A function create_custom_post_type() {' s- k1 ~2 \$ B
$labels = array(2 i# _" z+ E; D8 u
'name' => 'Site Wide Notices',
% f, A6 g" e8 ^- R4 a+ b) G: @' m. t9 L 'singular_name' => 'Site Wide Notice',
0 H9 z* m8 S( m% D# i 'add_new' => 'Add New',3 n6 z$ U% M' L
'add_new_item' => 'Add New Site Wide Notice',) k7 m z1 [ }7 U6 o% q. ?
'edit_item' => 'Edit Site Wide Notice',. t9 C/ |& p5 w) _: T9 |$ `2 z. `/ i, O
'new_item' => 'New Site Wide Notice',
- e: f5 e* h- X$ {9 O8 _ 'view_item' => 'View Site Wide Notice',% Z m8 h3 A6 T; |( v A
'search_items' => 'Search Site Wide Notices',5 ^3 F; j$ y' e& x; G, b! u
'not_found' => 'No site-wide notices found',9 |& W% \/ l0 i; `" L
'not_found_in_trash' => 'No site-wide notices found in trash'' ~0 a F2 F- v" t/ r
);" Y2 ?0 ?9 ]& _
$ h" _7 r2 Q+ p) w
$args = array(
8 ~# }7 {# {5 \! p 'labels' => $labels,
8 t4 X- [1 O; I- s+ O 'public' => true,3 ^0 _% A/ O- z7 c5 r
'has_archive' => true,
! R& Y1 A; h* W 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
$ v( ?1 H. K$ a' t. {) |* j 'taxonomies' => array('category', 'post_tag'),
( a4 k3 f9 C& G 'menu_icon' => 'dashicons-megaphone',2 x& E/ ^# g8 }( K! _
'menu_position' => 5,
6 D8 R- w D. F2 k- O 'rewrite' => array('slug' => 'site-wide-notices')
; O0 x9 }3 o G1 E$ H );" z+ n- P) O$ N; S0 v$ c Y
& [ R' j+ r- p g# j( ?
register_post_type('site-wide-notices', $args);1 D* F: O4 o3 \- r2 r
}# f1 v8 }% _# |1 r5 P) ^; R4 o
```
* ?% m; v* @0 W# Q* s) \; ?0 W* d& x+ f9 A {5 a( C/ b3 N7 z
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。$ u/ i& m% b7 @# `
9 D- I- n' \+ J: F/ k3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:- ~7 _, a4 |+ a, X
3 N: w% }# i4 K9 }) V
```& w( O \0 | L J- i" W
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
, O" v2 F5 M9 \ function add_site_wide_notices_boxes() {
) x" z2 n: W5 }5 P# K9 I add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
1 K0 V3 M0 B0 c/ b+ M }
, H A9 i2 o2 E1 _; P- x1 U# c9 `- }! P! o; E3 a) m- ?
function notice_details_meta_box($post) {
q j5 v% Q: T wp_nonce_field(basename(__FILE__), 'notices_nonce');
+ N, Q5 O5 T) l $notice_title = get_post_meta($post->ID, 'notice_title', true);
. c* \0 b l" I/ T* @ $notice_content = get_post_meta($post->ID, 'notice_content', true);: x* H: k& X& \( ^+ g: F" T
?>
0 x) b( Y* V ~, E8 S, V: Q2 R: p- c <p>5 I0 V' X/ s- K: w) I1 c8 K
<label for="notice-title">Notice Title</label><br>
z+ s9 Z0 Z9 n4 k3 p: O2 Q <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
; Q/ U, y/ r8 ~' L$ ` </p>
: w8 U7 s. A& s3 J( J <p>
4 ?6 W2 A0 q. k8 v- Y <label for="notice-content">Notice Content</label><br>
( U, c2 p7 E5 \& E1 I" ?8 ~8 v <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
& D* l0 F8 G: o" Q </p>
6 Z6 s' a1 G$ }" B) y; \8 j: L. Q <?php
& I' d% _! r( P9 d [" P }
! Q; ^" F6 m* M" z% H1 J q+ q! k, V) {$ c" U# D& k; Z( P
add_action('save_post', 'save_site_wide_notice_meta_box');( {! c" y6 _' _0 t8 C3 }$ d$ J5 O
function save_site_wide_notice_meta_box($post_id) {
. F6 r% M, x( C. j# p3 J if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))2 V2 L D. ?6 g% Y! I1 Q
return;
) I: @8 P9 k- |( P if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
6 \! F: C$ y$ a& q# v$ j return;% i2 A- t8 f# ]
$ w5 {) U+ H7 r8 b+ @' e$ u if (isset($_POST['notice_title'])) {
. f6 k9 |; }* ]/ X* b, ?( s update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));6 Z4 i `2 A; U
}
5 Z8 e( S' w0 a! r; K9 ? if (isset($_POST['notice_content'])) {) i3 H2 V; ^. C6 w+ [) `( d2 _
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
6 n( f, X( `% W7 \$ s6 ~9 F }
M8 @" u d! t3 F& Z# R* V }" e0 Q+ i/ u5 T& o7 c; Y# ^
```
7 x2 K- r6 c, u# q) n
: B5 r J! i9 Y' T& w5 I0 Q1 P+ o0 b 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。( ~- O+ x w; r9 t2 t' [
, s8 c$ h4 Q" Q# v7 l) y6 i
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告: n1 b, S: T$ Z0 j
7 @0 K! W0 |* m$ K
```
# k, z% F1 N, @$ c $args = array(
# X; }( }# t1 E8 W7 S( v 'post_type' => 'site-wide-notices',
; h: G# O( A7 K( f* I- e' K D ? 'posts_per_page' => 3,
$ [! v2 w1 o4 X 'order' => 'DESC',
8 P8 @4 A0 {3 V6 o! K 'orderby' => 'date'
; N! F, a/ ?8 m! k% t ); k1 p% W9 D3 u
$query = new WP_Query($args);
! {0 G k* i4 J: K if ($query->have_posts()) :5 B# `4 c; g: \7 t
while ($query->have_posts()) : $query->the_post(); ?>) v& m8 x7 J: v7 w
<div class="notice">% f- ?: p+ Q( @3 s9 d
<h3><?php the_title(); ?></h3>
% n$ |& ^! L \: m, \( u <div class="notice-content"><?php the_content(); ?></div>
2 i6 z* ~6 d6 d4 G* ~( } </div>
( N0 ^- j; B2 k- F ~ C1 ` <?php endwhile;' `) I/ q% J2 b0 R* p0 H$ c* h0 p
wp_reset_postdata();5 w) W+ y& ]* W0 ]5 k$ a; d' b
endif;
2 x6 m1 K7 V% s8 c# D) | ```
H/ p& F5 o- \6 V' B
. g* i1 N9 U4 b# I' K% F5 | 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|