|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?- m! ~: W s( y1 I
; z0 N/ _' s, P2 ]% U5 C, g如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。' ?: l7 t8 X" ]$ U- q% O8 Z
/ K/ x6 ~/ B1 m* ?& @以下是创建自定义插件的步骤:
7 ] a6 N; R- }4 B- N3 E4 y: B. M3 J! g5 L
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
" r$ D3 o5 z: M" P( w7 u6 p p! o+ D) Q8 A4 Y$ O) y7 u- X
```
5 y4 ^ X3 f7 \ <?php# X0 A# H; N# Z& |4 d
/*
( U7 p* L. N* `+ F. I. \, M Plugin Name: Site Wide Notices Plugin( f8 Y, ^4 F. a' M: o
Description: Adds a new custom post type for site-wide notices.
7 {- C3 J3 D5 J; E Version: 1.0
2 T! s& Z+ j* X$ |' k' d+ | Author: Your Name
9 w0 ]( j. i2 r) _( s* S Author URI: http://example.com
; O' n4 ?( [7 I+ G/ N *// R7 V: ?" Y. |9 E! _ b
- l! \1 T9 s0 z e# A* k: a // Add plugin code here...) s9 j9 K" r) n* z7 g
```" l/ P! [# i# }1 J$ [7 I3 S3 j
, A, r/ }% D5 y+ w4 t
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
) c ]9 U0 u# a V) g; ?! W* e A- k: e Z2 e/ n( T8 p& `. m
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
. P0 w4 F h) d; c# a* A
- ~6 V7 D# u2 F/ b6 `, t( g* k2 ~! t ```# p, q4 S- a$ u" O# X
add_action('init', 'create_custom_post_type');
: @ p9 X! a5 x7 y, y f2 s function create_custom_post_type() {
1 K4 U9 M- Q: u' r1 A $labels = array(0 w1 a# `2 E1 `4 l
'name' => 'Site Wide Notices',) O. ]6 ], X7 w& H
'singular_name' => 'Site Wide Notice',+ j' d, \: B! C7 i0 C, {
'add_new' => 'Add New',
2 b a: J4 ?! A) [- a- z% r 'add_new_item' => 'Add New Site Wide Notice',- p; ?% d a& b* o
'edit_item' => 'Edit Site Wide Notice',
8 f6 C6 U, O( @ 'new_item' => 'New Site Wide Notice',
1 R6 E8 O3 R2 k2 ~" @, \* ] 'view_item' => 'View Site Wide Notice',5 e, X1 }9 g$ {6 H
'search_items' => 'Search Site Wide Notices',# v5 }* [. w, `+ v% S4 ]9 ` J& M/ |
'not_found' => 'No site-wide notices found',
8 [9 Z3 a8 l6 i* j1 s; |( u# J9 t1 y, c 'not_found_in_trash' => 'No site-wide notices found in trash'
' j9 `( }5 _% i1 j );
& M5 F8 ?5 Z( R) T# I( X- Y9 P, Z' W& |9 w
$args = array(
# ]8 a# {# `$ v+ ` 'labels' => $labels,/ C6 o- ?% q6 c; S+ ]
'public' => true,9 }8 R9 ~3 X! t. Y( q
'has_archive' => true,: r" \) c7 G( }0 ]$ g
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),- A$ g) e5 W$ x5 u) V1 s( Q. K: q$ D
'taxonomies' => array('category', 'post_tag'),* q1 O* J/ U# ?" Q c
'menu_icon' => 'dashicons-megaphone',0 w1 r' y _- c5 [6 p% K
'menu_position' => 5,
- q* \9 J% Q p4 x& ^) D+ z, W% L 'rewrite' => array('slug' => 'site-wide-notices')! Q, \6 x' w: Y7 d4 u
);* W+ d8 d& h6 Y' N! d6 \# ?
; e/ S& Q) m" b& y
register_post_type('site-wide-notices', $args);
& @, l4 e8 e! n5 i/ U4 I/ ^ }- W% i; A# y- ~! D" \" z
```4 K' z4 R& W6 D
3 }3 F! ]$ K4 ~" c 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
* k8 B3 I4 `, L* S
! V9 a# p L7 h! Q4 O, A: L7 S+ c& |3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:( J( |. K3 ]5 f: n. f
/ ^& a6 R) p2 G ```! c" J/ L0 X8 y% k8 U
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');' f0 b. s% M# H6 D
function add_site_wide_notices_boxes() {
9 Y$ V3 B& }* `/ g add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
6 n5 e* Z6 h5 B3 _0 X/ p ~ }
6 Q' `7 q! K& t6 T* u1 a; L. \7 l
* Y, Z6 \6 ~: _0 n function notice_details_meta_box($post) {
4 g$ E) D8 Q8 ~0 Y wp_nonce_field(basename(__FILE__), 'notices_nonce');
- j5 I4 a( l& G& T9 y! J3 r $notice_title = get_post_meta($post->ID, 'notice_title', true);
5 S. O2 @' E5 m+ P( d, z& O $notice_content = get_post_meta($post->ID, 'notice_content', true);
- u" [) q. A G2 J2 A" i ?>
0 W7 _+ `! I, o/ v7 ] _) p- _0 A `9 G <p>
: U. H3 H5 e9 B <label for="notice-title">Notice Title</label><br>5 ?( C; {4 e* C# ^: z. P
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
2 ~2 L i, B) D/ ^5 L. Z) k </p>
. w0 ^4 Y0 Z1 S# a8 L8 P <p>+ Q7 |; \6 p% _! C. H% U% \' m# O2 J
<label for="notice-content">Notice Content</label><br>; O) N, w4 y5 @
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
$ K4 c6 L! [: T* W+ e& ] </p>6 l, W A3 E3 L3 e2 E+ ?* v o
<?php' I X) d! h V m: j
}
6 j# i0 ]8 G+ q" D& U" S* J* x, G& @5 D( u w: {/ a
add_action('save_post', 'save_site_wide_notice_meta_box');
' ^' @* Y- y& t' _: J* u function save_site_wide_notice_meta_box($post_id) {
4 E# U0 `3 c! ]8 b' Q- ^0 O if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
: {# w5 ^2 `/ g& y* o return;: w$ Z% i2 M& q5 R. z
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)+ V' `$ f1 k# E
return;
, e3 E$ a$ E0 {7 J4 Z4 D; z( `3 r
# Y: \! K: Z7 L0 O. W if (isset($_POST['notice_title'])) {
+ ]' v8 j* r& b3 y update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));3 W% e- n8 O) d9 h$ g$ f
}- z# ^2 P& R2 r. M
if (isset($_POST['notice_content'])) {* m# D1 K- ~' m( Z
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
5 V0 y6 g$ y7 c& O: c5 |. ] } O; E6 t; v& b! M
}
7 C3 t f/ F* i% ^7 q; e# k5 I ```8 K r3 N5 k1 m" O3 f
; E" V" R7 O" {
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
5 n* C% c5 X l- t8 ], k; P9 F# D: Y4 ]2 w/ ]3 s/ i x& |
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
% @( t5 H3 ]7 \4 D1 y0 H- O- J1 h6 \; ?6 V9 l/ l' F \
```0 H; D. R9 E( [
$args = array(
: Z. N% r3 i% D7 O 'post_type' => 'site-wide-notices',
+ J U3 L8 w, |7 i 'posts_per_page' => 3,! C* |# u& j# O+ G' j, \5 F( J
'order' => 'DESC',
- n& f, W& V+ Z0 n1 ~ 'orderby' => 'date'
# A, ], ?2 i2 E+ B );% B3 c: W8 P8 b: ?; T! d
$query = new WP_Query($args);
5 X3 s1 ]: D! l7 x4 Y* @% B2 ]3 h if ($query->have_posts()) :5 |6 }+ ?$ |. ?; F3 ~9 m) V
while ($query->have_posts()) : $query->the_post(); ?>9 N9 Q% n& I, L% T" @
<div class="notice">
$ U/ s9 @1 _9 ~3 Q: A4 y <h3><?php the_title(); ?></h3>
9 _: Z5 V# Y' ~. c. Z <div class="notice-content"><?php the_content(); ?></div>
( Z; o- C% U _7 a </div>' I; T! G( d; T
<?php endwhile;
; ? C d: T$ c5 l! [) _7 B% i wp_reset_postdata();( j# i2 J8 r1 c- f- k+ H. a
endif;% z$ y, |( h9 |+ t( Q f2 @$ r0 O6 I
```& W, t5 b8 e% I4 \" F3 K2 m
1 y" ~5 X3 l: m
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|