|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?- K* h3 c" [9 b8 Q
" L. a: X; X, v3 Z1 j9 ]1 I2 _" }
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。+ H" V2 U1 b- U$ m" V& w
' `* Z% |. p9 B/ V
以下是创建自定义插件的步骤:
) g$ ?5 ~% h) t% y, _7 Y: Q2 C. ^1 B( [$ v6 _% H/ K# U
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:" ?, D% ?3 p4 M- |; }
* o- F6 f2 U D
```
: M F" e3 n% \. N3 G& Z9 n l <?php$ \4 G! t& ]" j0 ] |' _& g; d i2 u
/*
; Y4 o$ }' c2 @; T Plugin Name: Site Wide Notices Plugin
, m' ~% Q* ~% { Description: Adds a new custom post type for site-wide notices.
6 g* k% m7 n0 |: c: z; Q Version: 1.0
% I0 }5 o8 z+ P; ~3 ? q0 o Author: Your Name! w: E+ c0 k0 \1 U- Y8 J
Author URI: http://example.com
3 ?& D8 q; O" \* J. P0 q */& J! N. d) k% f% T# K4 D7 G* y
7 h+ f5 D6 }" |. d- N3 M% U
// Add plugin code here...
6 I$ E0 B4 z5 o; W ```
" q! P3 P c3 R) c+ i% d" P; _$ N0 L! H% [ _' X
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
% Q: R/ w4 L+ o+ N! }2 b3 G6 Y- x+ Q/ S- Q& Y. R s) |
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:1 c& j+ J- i5 @' I
$ Y' l1 u. X6 l ``` k4 f# t; W7 g- I8 `' N
add_action('init', 'create_custom_post_type');
& q) g7 y6 @( S: ? function create_custom_post_type() {) A6 [$ {. J. D+ v) o" v1 N. v- y
$labels = array(/ L. F6 `8 G# X' Y5 l9 S
'name' => 'Site Wide Notices',
% I: z7 c3 B3 S, r; k U$ T 'singular_name' => 'Site Wide Notice',. C5 ~( n0 @8 B( B- W [) o& q( B
'add_new' => 'Add New',% n8 f1 j+ b Q! [8 ]9 w0 v
'add_new_item' => 'Add New Site Wide Notice',3 f- J! Z# v, e' U
'edit_item' => 'Edit Site Wide Notice',
5 |9 O# q$ O$ e+ Z! x 'new_item' => 'New Site Wide Notice',
1 B) Q4 w7 X" A P2 U9 z! F 'view_item' => 'View Site Wide Notice', n) n" \9 e! i4 B9 ^) Y. g+ o
'search_items' => 'Search Site Wide Notices', q4 C+ `* a; ~+ `
'not_found' => 'No site-wide notices found',
) T! g+ P) O% y7 s6 u 'not_found_in_trash' => 'No site-wide notices found in trash'9 B V1 Q- u& F9 }5 ]1 E( `
);, C H+ x3 h7 l( N. p6 Y) G
: R+ F. n$ W7 V6 ?2 T
$args = array(2 A9 {' v$ h" K5 L( W# z* |# R. ~! z
'labels' => $labels,
% B6 B% @$ C/ M T1 c5 I: n 'public' => true,
; T- V$ w$ H; N6 N 'has_archive' => true,: K5 k3 O# A: |
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
7 |# P# q8 k _/ J 'taxonomies' => array('category', 'post_tag'),# n2 k( B: z+ [4 A D+ D7 ^
'menu_icon' => 'dashicons-megaphone',
1 q# J6 }" c, C$ n 'menu_position' => 5,4 f, N6 C' w) P- s1 l
'rewrite' => array('slug' => 'site-wide-notices')
7 Z! @! I7 u% K) w/ P& q/ E );+ I& b: z1 h( {
) U6 G+ p2 P$ x A; e; M9 k+ r) R
register_post_type('site-wide-notices', $args);
- m3 M( h4 H# i B/ H6 v }& _* [3 s, g; v5 Y# q) p) b$ x
```! `1 V1 M2 H% ^" k D& l2 X
- l+ y% {0 l7 Y' O! o2 h" G, I q
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。7 ~1 w* S/ F1 [* R% ?; M
) a: e! E6 S _& C1 Y8 V2 \: ?3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:# N L, s6 k& h8 ?4 d, U
) ?( f' ]0 \' X+ X5 c
```7 A- ^$ ?0 |4 e. X8 X/ X
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');6 I1 }1 i t v" y( @8 H
function add_site_wide_notices_boxes() {' S5 t5 k- m+ k: ], ~
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');% ]4 |. c* ?2 o' H* Q/ d/ f2 l
}1 x: r8 v2 j$ ]9 N6 ^. |2 Y3 c
6 r0 k+ s7 x' s6 u7 ?
function notice_details_meta_box($post) {
3 C! _( W7 S' M8 M wp_nonce_field(basename(__FILE__), 'notices_nonce');, N" C- h/ o' L. W
$notice_title = get_post_meta($post->ID, 'notice_title', true);
4 K0 N/ J9 m/ y $notice_content = get_post_meta($post->ID, 'notice_content', true);- T2 D- J3 I* L) [7 |: Z5 v( R! X
?>
+ S- _+ @5 @$ W3 q <p>
, T. U: X; r* v0 n4 A2 W& ]& i- {9 Z <label for="notice-title">Notice Title</label><br>
/ B' o: ^! F' F0 \- }% T <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
3 u1 h! ^, A3 a! g, X9 L/ J </p>% T6 Q& T( e3 L- q3 h
<p>
" c# c, ?' \, d n, ] <label for="notice-content">Notice Content</label><br>
! D) l j& l4 \ <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>! W: O" P: [) e
</p>' k- X+ l* \) A; t. h2 S0 k7 L
<?php
5 Z+ t U& U6 X+ j; \ }
/ `6 _7 S. N- o5 ^0 A, S
- w1 u. h" x. T add_action('save_post', 'save_site_wide_notice_meta_box');" j9 `/ Z; t% k9 l k, W
function save_site_wide_notice_meta_box($post_id) {8 \* G, B" c2 l+ A" h7 Q$ b
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
) b, V3 P& e0 \* x+ @ return;& m; g O0 G+ X% @9 I, j, l
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
|/ _+ }( K% b9 L return;
3 O4 Y5 T! a& }9 M$ l/ _ w! U- Q9 p# {6 K. z5 n! {5 C8 U1 c
if (isset($_POST['notice_title'])) {
8 l' p3 g; e0 n6 Q# R. c update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
2 ]% ?0 X, y, G9 b5 p }
0 [7 ~' \, O6 n0 i8 T if (isset($_POST['notice_content'])) {& J- F2 q4 B. z/ N: z* }2 y
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));6 o# x0 k' K% g" p' f
}. Q# G% m$ L9 Z) C9 p& u9 Y
}
( i: F) Y& n, P' b ```: L* X2 W7 O3 b8 \1 z" W3 D( j
+ T: {; Y: a( x+ \8 {/ S% M9 G* O 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
6 S4 M6 c! e! U
# \2 _: v) w2 q" G4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:+ v( Q- ?1 s3 p) q1 F9 v
' P% m. q: `6 F' I; d5 I
```
7 R/ R3 t1 a( F4 R $args = array(
) P' J9 m% O+ f: Z. Q+ D 'post_type' => 'site-wide-notices',
o& k* i' k2 w( G! {( R8 B! \ 'posts_per_page' => 3,
# h9 u# C! L, j0 c# @& L; H; M 'order' => 'DESC',0 K4 X, ~2 F+ \4 a. u
'orderby' => 'date'
2 G6 i c0 ]) I) S );
2 h! B0 H( _9 X $query = new WP_Query($args);2 F1 V8 b" x( e
if ($query->have_posts()) :* Y/ r' F2 J2 I
while ($query->have_posts()) : $query->the_post(); ?>( e- Y. E% i8 w G
<div class="notice">
8 J0 ~ O( `' |$ k5 j; F! \ <h3><?php the_title(); ?></h3>
5 J1 @& ~- a1 E* y" ]9 @4 n$ P <div class="notice-content"><?php the_content(); ?></div>
0 Q: _" R5 W9 u8 E T </div>
5 X# `0 V' k1 W' B( U' e <?php endwhile;
) L$ }3 y9 g8 I! ^7 a wp_reset_postdata();
" H; \' p/ ~+ V& Z5 e9 Z2 |4 y3 }' F endif;
. `4 }# s5 w, I1 X ```) ^& @1 Z% w4 Z% _( M2 V2 L
. Z4 f( c$ j1 ?- C' ~$ Q/ ~9 m 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|