|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?. d* G! J9 k2 Z3 z
2 H7 M0 t8 E) y$ C }3 x* [如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。/ l# H! e. w5 w
$ F, R$ ]# m) k0 ~5 ?: {; C6 Z5 a
以下是创建自定义插件的步骤:* Z1 C9 I' V* F9 V
: N0 `+ C) H# c
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
6 E' `; _! T5 F9 d! U; u
" i& z) U% o4 f2 g ```
. Q( j6 w/ D, h& o3 }' t. a3 G4 G, ` <?php$ v: J0 d3 f/ t! X( f& c) _1 R2 o
/*6 B Z9 p6 c2 \" b! W2 F
Plugin Name: Site Wide Notices Plugin8 g: E1 a" i+ A" l# s, G Z4 M
Description: Adds a new custom post type for site-wide notices.
# D/ s& t3 m. w& {8 {9 ~5 b" A Version: 1.08 Y/ Y" ]4 R5 h. ]
Author: Your Name4 N9 u1 S. q7 O. R. H$ H
Author URI: http://example.com3 @! J! i/ n. [
*/
, h6 f# W0 {& m+ x( R9 B) x
$ K( u% g' o6 d6 G# D: u% J // Add plugin code here...
1 @6 J3 Z: ^; J. s ```$ j; h; q9 ]0 @$ {6 s' t
" n! ~9 ^& }) Q( P; [$ ^% _
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
" A" y+ ~7 |6 Y, q6 ~1 e$ F5 k' h9 `# ^$ L3 y- q& j' r
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:3 E0 S2 E2 z& I2 i2 \6 s% u8 X
6 Q0 h/ Y8 P' J- V+ G# f7 u ```( S" y3 B2 N$ [7 Z Z/ m7 M2 B2 h
add_action('init', 'create_custom_post_type');& W% y3 n0 N. ], [0 q$ e. A7 m9 A
function create_custom_post_type() {2 k. W1 \1 x4 L& }" ^
$labels = array(9 i; ?7 O! |9 ^) ~9 N
'name' => 'Site Wide Notices',; J/ A& n T i- p- D. U
'singular_name' => 'Site Wide Notice',# M! Q, N' A; g R6 s# i
'add_new' => 'Add New',5 w/ @& Y5 `1 L8 V- j9 b7 { S* [
'add_new_item' => 'Add New Site Wide Notice',
' M' T' X- `2 a) h! {! ^ 'edit_item' => 'Edit Site Wide Notice',' w8 Y) `. ]. p6 H! y _$ Z' K9 {0 f% @
'new_item' => 'New Site Wide Notice',
; v5 o5 G. f& P 'view_item' => 'View Site Wide Notice',
M0 x' g. U6 D! c9 H' o' F 'search_items' => 'Search Site Wide Notices',
" x; M5 J+ {4 I' p+ t 'not_found' => 'No site-wide notices found',. H6 d- t y: I" {5 Y( y
'not_found_in_trash' => 'No site-wide notices found in trash'5 m: q1 ]& J2 k; g% o9 X3 w5 {( Q
);, z+ O) f! P( ]5 K! g! f4 {
' o( A9 B% c' V/ A* W $args = array(" {3 B. Z# \) D) w
'labels' => $labels,
6 b9 w* X5 v+ Z; W. A 'public' => true,
b: Z Q# B% K7 t; P" V% F 'has_archive' => true,) C6 O; V2 D3 V7 j
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),' Z: c1 K3 u1 T; ^4 `
'taxonomies' => array('category', 'post_tag'),- h% H3 f% E* Q, o
'menu_icon' => 'dashicons-megaphone',5 H0 _6 ]+ f7 u1 Y$ z8 l; n
'menu_position' => 5,
+ q) d D' @2 W8 o$ p5 f- G9 G 'rewrite' => array('slug' => 'site-wide-notices')
0 ~: q$ }! G: ^9 _ );
8 b7 `- l; L8 U" ^$ E# a3 q3 J# l! g* C8 S4 f( T& \6 z; d
register_post_type('site-wide-notices', $args);* I: A/ @# r: T% z
}. Z8 w2 a; E0 S! X5 F" m x
```
Q4 j* b) ~% ` Y1 O
) V. Q8 O1 O8 A: b7 y 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
- k# h j5 A$ S! B3 Y$ M
+ C" `% m9 B% \0 v, c3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
+ {% S, [$ e! S% |. {% x. o" ^6 o! z( O- Z8 V' |
```# k! u4 {8 s- {4 h* e8 ]
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
5 W1 j& ?8 a; u5 a function add_site_wide_notices_boxes() {
/ ], u: \: s' j) F. z0 f add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
. _- a" F) h8 V0 A* T" Y }
. Q7 ^5 z1 B/ \# O! X
! i+ _5 X. G5 T7 r" i( s function notice_details_meta_box($post) {
) F3 z) i( _) c* Y/ B wp_nonce_field(basename(__FILE__), 'notices_nonce');; c; B0 k% b$ c9 D8 t+ ~4 c
$notice_title = get_post_meta($post->ID, 'notice_title', true);
) G- ?0 f& C9 u$ B& d8 ^ $notice_content = get_post_meta($post->ID, 'notice_content', true);% M$ _+ h" S; d0 Z9 @6 |0 H
?>6 O% h) ]9 v" d, T; o% \0 h
<p>
# H: v! R& |& U <label for="notice-title">Notice Title</label><br>
/ Z6 Z+ B1 u5 [$ e5 z <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
1 U; B5 X3 x/ P0 N/ I* ^& ` </p>: K! W I0 t" e9 N9 m. f
<p>
0 [% w( J3 X) p2 S9 x# _8 U <label for="notice-content">Notice Content</label><br>
! P! E5 m2 Y8 ~; I <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
8 {8 B y% O) s9 y3 m. {3 L </p>/ s$ b! a4 l5 n4 P2 j; E$ F
<?php$ S4 B) `4 T) h$ R) B
}" h3 O" g0 P3 W# `5 D# s. K! ~! N
; H/ c. }& Z/ e: s! b$ c( K
add_action('save_post', 'save_site_wide_notice_meta_box');
e, y+ v1 [4 @* Q2 x; L6 T function save_site_wide_notice_meta_box($post_id) {
9 p$ h8 Z7 ^4 }3 G if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))), n$ B( p% D+ q a2 M
return;
& O6 S+ }( @ F; Q+ d* z if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)6 U0 d% t. u& l( {
return;" e3 _( k) {7 \: j
9 V9 g3 t+ y' {$ b! F5 B8 f; ]) f! f3 c if (isset($_POST['notice_title'])) {( T4 H c6 H$ _! K; Z- f5 U
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));* Q5 G! I1 X4 P7 S0 t
}% L$ n7 E( k9 b: R
if (isset($_POST['notice_content'])) {
% @+ W/ f+ x1 |: f$ D: \ update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
, s5 q( E# u( b5 I$ n. E. p6 s }9 M- r. p$ m/ C0 \! ^ |
}" R8 [1 K b7 N7 q3 k/ a+ q
```3 \' B' N( a1 l# W
8 J! j, H s1 f& |1 b/ q8 t+ r8 H
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。0 @( J! {. ^3 R S8 A' O1 r$ {# ?
5 ~ j2 g, Y. N/ w& h" k! X4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
! C* ?2 }) z; K5 b0 X, o# }, {% k+ y. O$ _1 `* s; @) V3 B. K
```0 [% Y3 v4 e6 g6 H1 j2 [- A* R
$args = array(
& Y5 j2 W, |% Q/ z8 {; q; ~ k, V6 W 'post_type' => 'site-wide-notices',7 ~1 F6 Z& y6 y* {( U
'posts_per_page' => 3,* E& C5 p. M6 q$ Q
'order' => 'DESC',
, \! x- H. _9 {$ n2 |6 ?( U 'orderby' => 'date': l. W+ _/ R% k
);$ E6 Z8 b1 m- w/ T' R# D
$query = new WP_Query($args);8 ^+ |" _5 A* `+ l& a
if ($query->have_posts()) :
0 w1 B+ [8 t, z0 _ while ($query->have_posts()) : $query->the_post(); ?># D. `6 {5 A8 C( t, j* x+ p
<div class="notice">2 {; m% j. z) Z, j; K& H7 _7 s
<h3><?php the_title(); ?></h3>
7 d! q) A+ q9 D+ h/ \ <div class="notice-content"><?php the_content(); ?></div>
% {8 j0 E9 A( G8 [6 p5 w- Y0 X </div>
+ d5 z3 j7 h) J <?php endwhile;: }% U8 ^1 _5 h
wp_reset_postdata(); {* J0 M; e$ ^
endif;
$ `. Z4 H& V6 h5 v( c ```" P7 j9 w2 a) X) }6 `9 m. l
- O% N Q/ p' \, \" \, ? G 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|