|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
8 M# t# ]2 m- m7 t5 B9 b0 W7 }& r( Q7 g' c/ V: F1 f7 L& h& F
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。5 c! z: G D$ B2 V1 C( U7 q- ~. \! {5 U
+ ~7 }7 u( u# n, E' m# F* M6 z以下是创建自定义插件的步骤:
5 H$ X3 A/ G+ X( V" n2 \/ R% D6 O6 O! D. G
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:- o1 L! w1 q; r6 @: b' V# Z
4 o, W- I: j) f. H Q/ S# Q; T6 ~, @
```
@% @, l6 Y5 G! w/ N8 | <?php& `) R4 {8 e/ {) B8 F
/*
4 q; F, I; F" m) X* ^: F* g5 x Plugin Name: Site Wide Notices Plugin
1 C, G* _+ f6 H1 K2 d Description: Adds a new custom post type for site-wide notices.4 [3 e2 P( w* }. t
Version: 1.0
3 ?# `+ }# {9 w7 \5 x Author: Your Name
4 B8 b2 {0 R* Y Author URI: http://example.com
) Q" R8 Z+ @; N1 W3 {' l B3 V */
3 |2 v6 P0 T- H
, r6 s; {9 ~ U7 t1 W // Add plugin code here...' w2 M: s8 b e+ c, T
``` }7 n& @! V& N
/ E; W& e/ ~1 J6 Y! W* g
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。# S0 F" r: l7 e9 `, m+ T
% C& Z+ ~. L9 {/ }2 S R2 @5 E, r2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
7 r m) [% a C: A9 v$ m1 Q: M8 \+ t& D" n6 A/ w
```. R' C; B- E( B$ n5 o
add_action('init', 'create_custom_post_type');
6 }' g& ^- B* c& s function create_custom_post_type() {0 z. U7 W; E2 I6 ~, z
$labels = array(
2 m% _6 N ]8 f 'name' => 'Site Wide Notices'," @: V6 v% I* m4 E3 p# U) C' }* R0 I
'singular_name' => 'Site Wide Notice',
/ c3 I3 D9 ] o1 z: Q2 v5 F 'add_new' => 'Add New',
4 \8 r; }; p2 P- w( m0 k8 G: ? 'add_new_item' => 'Add New Site Wide Notice', U' U# H) z- [
'edit_item' => 'Edit Site Wide Notice',5 N( ?% s d" W2 O
'new_item' => 'New Site Wide Notice',
6 j) v4 w8 K# r( D 'view_item' => 'View Site Wide Notice',3 b! i) T1 F2 i2 `5 H
'search_items' => 'Search Site Wide Notices',1 x4 f) b2 v- w0 q5 n; e$ b+ @
'not_found' => 'No site-wide notices found',
/ C- w( {* L2 N; f 'not_found_in_trash' => 'No site-wide notices found in trash'
3 r$ Y/ h+ z4 [2 n );" \3 c2 e8 V4 ^. V2 F6 `" S
+ Y1 t9 B5 I P7 ?7 p' m% J* c
$args = array(
1 M( p5 F" b# f+ B# g$ M4 K 'labels' => $labels,
g. m! [- G# T" \9 ^ 'public' => true,$ l' ]8 o* p* `( ?1 r
'has_archive' => true,
' G$ Z/ t: x# h& @8 c$ m 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),7 c2 v' ~4 v- S3 e
'taxonomies' => array('category', 'post_tag'),3 {/ V5 R( _1 T4 K: j8 r. ]7 C1 E- C( P
'menu_icon' => 'dashicons-megaphone',! s- P3 E4 G. Z+ h: {, N4 i b
'menu_position' => 5,
8 ~, @# Q! L1 f. M8 J 'rewrite' => array('slug' => 'site-wide-notices')
, M/ D" y, `2 b: l5 D' g2 z2 s8 g! h );
5 Y* m/ Q9 B! l! ?1 k. {+ B# }4 c3 |' C6 z+ L8 r% i k
register_post_type('site-wide-notices', $args);( Z7 G- E1 o: k) h
}7 e1 u! i( V$ _6 H1 M3 X2 c8 |
```
6 m v1 g. |3 k1 f1 W& [$ M+ ]! ?# s6 o1 U3 G1 c& H
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
: |2 J2 `" i+ Y5 r) t9 w. ?# \+ ^9 Q& i* o
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:* Q& [/ e2 ~& P" j- G
2 B' B& y- }' V! g/ E
```& R, @. J8 W" c4 q/ w! u/ _
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
8 y9 `# s7 U* P; B! F5 ~ function add_site_wide_notices_boxes() {' ^$ q' P2 q: m/ R" `" M
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
8 C y# z/ Q0 ]6 p, t }
; ]2 ]7 L4 B0 E4 F, i
3 L4 y" C5 m% p, E, z function notice_details_meta_box($post) {
) t3 ?3 M; [# Q, C7 R" H wp_nonce_field(basename(__FILE__), 'notices_nonce');% d+ U4 w" |) i7 l; A% B
$notice_title = get_post_meta($post->ID, 'notice_title', true);1 `) o, N9 B$ h( s) s# r
$notice_content = get_post_meta($post->ID, 'notice_content', true);
( z5 b7 Z; c* q f) N% @ ?>
6 G% H: Z5 c8 `+ }+ @9 p$ F <p>3 `' U( w" B, v. r$ E
<label for="notice-title">Notice Title</label><br>' I4 p$ Q' W7 I5 o V
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
* g3 V8 p; g" E7 n; O </p>6 \( m# G; E; s) s- g6 `& R
<p>
1 m" A; I8 C; X0 y" { <label for="notice-content">Notice Content</label><br>
+ o1 Z! ^8 C8 E+ q <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
; R( I2 @& E" v* T/ ~ </p>
5 e1 Z/ ^4 @: X# H9 d8 T4 f <?php6 a3 n6 Z' ^/ |
}
+ { _1 K" [! C: o% v% P8 J' d( ^# v, Q5 q! |! H/ B. \
add_action('save_post', 'save_site_wide_notice_meta_box');
) |2 |7 W" x& x function save_site_wide_notice_meta_box($post_id) {/ K% i# w) T8 @* r6 [
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))), i3 E+ E, v8 \0 C p! [! y
return;' }( h/ }( Q- T1 q6 r# B
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)0 C+ I7 _5 [2 [& [
return;; k/ p0 A1 E0 \' E" {
% s, b4 p- `* | if (isset($_POST['notice_title'])) {
- ?+ S4 }3 _6 g* o) T update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));- l3 |2 [: G+ \0 ~, t3 A3 f& {
}
0 t% C* G% q. W; V if (isset($_POST['notice_content'])) {
; `9 d$ V2 G3 t1 r9 o update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));* e6 \1 A# |' O. D: x: q b. i
}
/ A S* }0 Q- n% J$ d* {: i }" s& G8 _$ N5 C+ {. [! c8 u9 p" X
```
9 x% H* Y0 @8 V9 k( |2 f* k! v' ?/ d7 G6 G
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
d6 A! _% l8 C4 c" d+ `2 N. V. G3 _4 P/ [ P
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
2 P* k4 W! P( ^3 p9 m/ P- `: p2 |1 `; H
```
3 n# M2 Z/ e( F2 u( T" z } $args = array(5 c! [; G" d$ {7 I
'post_type' => 'site-wide-notices',3 D( j4 Y; t5 O8 b1 S
'posts_per_page' => 3,' A$ N5 \9 R( j$ p
'order' => 'DESC',
, d/ ^3 v' x3 U1 J; r1 g" o 'orderby' => 'date'
9 d& |8 M! r* f, s );5 ^& z6 \/ X; i) m
$query = new WP_Query($args);
9 U* V" X1 E+ b- H if ($query->have_posts()) :) A4 U6 u7 S: H9 y9 j3 f
while ($query->have_posts()) : $query->the_post(); ?>! f% n$ \$ _/ A
<div class="notice">, A/ l# N8 e8 n6 w9 l& X
<h3><?php the_title(); ?></h3>4 k' u8 q* k1 C9 l4 Y# t
<div class="notice-content"><?php the_content(); ?></div>% `/ x* C5 C5 A0 ]1 F0 }5 Y
</div>
+ I \' {1 C. O f" _0 x <?php endwhile;) P, B# a( ~( y1 X9 Y- j
wp_reset_postdata();) Q4 ?- S8 j; R4 V7 o6 f8 F
endif;
8 V l% B% v4 D0 h, f0 P8 q7 }3 K ```
: K; T. T% ~! \; U/ N& z3 `) V% \4 Y# P/ [( a
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|