|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?/ `3 K7 f% K" F
2 y; m2 t/ @, L
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。* W! |0 N$ R# O
% g6 |( S3 h- T; ]: }
以下是创建自定义插件的步骤:
$ ]5 m* C- j' g Z% W3 t1 k. m3 x2 i1 P4 m1 p% i1 R- n# N' G; r
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
6 b c# q! l$ @7 K) B
! F, {" t0 A, o7 q6 W/ G ```
- r% ~5 P* h& J- f# F# R* ^ <?php! X# p1 G, x1 _3 \* F
/*
' l e3 B$ z$ `) W. ~3 P) U Plugin Name: Site Wide Notices Plugin
, R" u4 A4 i- t Description: Adds a new custom post type for site-wide notices./ T, ^9 I' U! X1 b$ c) ~
Version: 1.0
- h, W+ B8 H$ f# i Author: Your Name
6 O i( H& g" L5 x x Author URI: http://example.com
/ }) j5 @7 h9 @6 R6 H3 |: q */
# v0 r) O5 x" k
* T9 k3 c+ ^$ _( y: k) G! k8 k // Add plugin code here...6 p- a, Q% ]0 ^" l) r( \
```
8 S0 ^6 |+ k( J+ }; K( Z$ d% s6 E; Y2 {5 C0 Z O
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
, u$ T) Q: L. `1 ?2 {: d1 C$ L3 I" I. }% |6 L5 N
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
% H) e3 [8 h( k& O5 H: E2 _* w5 Q' s
; _* c$ e9 w4 b- Q5 J ```
7 N, o9 ^( k4 ?7 b/ t8 \ add_action('init', 'create_custom_post_type');
* C8 I+ B; i, Q5 z& L function create_custom_post_type() {+ F7 }6 U8 b. h8 u) Q2 L% d6 d
$labels = array(7 G. T9 u$ g" c
'name' => 'Site Wide Notices',
4 P: v( M5 n ]9 p( H1 r9 l; O( Y% { 'singular_name' => 'Site Wide Notice',& n( @8 e$ m' i
'add_new' => 'Add New',9 Y& \, b; u* O3 d$ C. x
'add_new_item' => 'Add New Site Wide Notice',
" a3 h% e1 D9 o3 `* {% }1 Z 'edit_item' => 'Edit Site Wide Notice',
7 e; f9 Y4 f" Y' ^6 T9 S5 | 'new_item' => 'New Site Wide Notice',
. E' ^0 S/ v0 J' K 'view_item' => 'View Site Wide Notice',8 b4 T9 w, N! f% F3 e) E
'search_items' => 'Search Site Wide Notices',% q! w/ p& Y$ P" e% j
'not_found' => 'No site-wide notices found',
, W3 X+ R6 ^2 L9 L# Q9 h W 'not_found_in_trash' => 'No site-wide notices found in trash'# ?- j6 T4 Y0 c0 p* A. W/ E
);
* d% q5 t" z5 B9 C9 n! U4 m0 w* {( O- o& V- {* O
$args = array(3 s8 S9 N" L" k9 y7 x' ~; p
'labels' => $labels,7 [7 y: n( } U2 D( D- p
'public' => true,5 b3 j; F; A W5 a
'has_archive' => true, W- @/ v" u1 R a4 k q, L
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),* {) E$ [! C" B" }. D4 O3 k }( B4 n
'taxonomies' => array('category', 'post_tag'),; B% x. ~( B. G0 `4 E& L5 x' c
'menu_icon' => 'dashicons-megaphone',
$ X% d& o; u% t2 C 'menu_position' => 5,
/ d+ ~# m3 [* T f, u; x' M* g 'rewrite' => array('slug' => 'site-wide-notices')
; @7 z$ h4 n* F; `4 t K" e );
. w. G5 h8 \ u3 w4 B) }( f9 { u2 F0 i, f' B! Q
register_post_type('site-wide-notices', $args);
* [8 d3 A# W% N, p2 n }
. y8 f5 I8 l* s6 e: ?: |$ h ```' c U B! R' V! X3 ~( v/ z
. {+ n& b8 ?& a 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
P+ ~/ R) c y; E' y& p( ~, c* e; }. |2 X/ J" o: p
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:# U2 @( c3 l* ^
+ B) ?3 M1 U$ U/ m: Y
```2 g2 o; |/ o/ T7 P, s: y, L8 T
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
, i+ m3 b& T3 L. P" F0 a8 ~" b4 c, _" D function add_site_wide_notices_boxes() {
9 E3 K5 _8 n3 } add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');3 p7 h$ A m8 V
}
! h) x) r) r) u" w: L* {
% ?6 @5 A* {1 l2 P6 R$ a function notice_details_meta_box($post) {
1 O* M* q1 Z2 b, G. E wp_nonce_field(basename(__FILE__), 'notices_nonce');1 _; r L! c* P: ]
$notice_title = get_post_meta($post->ID, 'notice_title', true);2 G" Z7 v; `) \
$notice_content = get_post_meta($post->ID, 'notice_content', true);( Z( s9 V! P) W: ^( I# V, M
?>
' b+ n8 K! ?- G) K4 a! e& { <p>- F+ C* k# i: |# K n5 e- Z- {
<label for="notice-title">Notice Title</label><br>2 D3 v* n! r% l
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"> {1 v5 p! U1 l0 Q ~& r! F, [9 a, E% E
</p>1 Q1 A- \( _" Q+ ?
<p>1 s# T' J7 x0 C2 F6 l, m
<label for="notice-content">Notice Content</label><br>
8 G' }, q7 g( P) `$ L! l( w/ \: e <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>( J- P! R3 s% |( W% @" |, T1 [
</p>
5 t* L& v# M6 n! H- p <?php
5 D( Z4 l, y, Q* A/ g) ?/ X0 m }
. B4 H7 \( [" i# z5 y5 b. Q* Y: E" V
9 N" q0 I8 t1 I' u add_action('save_post', 'save_site_wide_notice_meta_box');0 {3 ?" d- k3 B5 g6 P! _4 b
function save_site_wide_notice_meta_box($post_id) {
' t- B# |. Q( z9 J3 T. u if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))): T$ l5 E# |( ^# W2 T
return;
( |. A) j6 {: q" k8 ~ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
+ [- H! R/ w/ }# x a. c return;
* b, y4 K5 W; [: o# z+ z( k0 f/ X: @
if (isset($_POST['notice_title'])) {
9 L/ }9 y; B/ i; J update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
' H1 ]; P- p. T# f* t) \ } A ^" Z) @7 Z" N+ J* g" l
if (isset($_POST['notice_content'])) {
- ]& i0 F, V# J# D9 [' U update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
, Z, T$ W! z' J3 | }8 X; S8 l! i2 M8 m" l/ c, v
}
: R6 ]& [# \! t; G/ h4 \ ```9 ?) x2 H* i( }
1 R$ \0 K- {2 h' @, k# S' T 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
d' T# p6 k8 w! R8 j" ?9 s+ ~+ g- ]8 L0 _2 E! K5 H
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
( R/ L# _; L# d2 b$ M, k/ N1 u8 J9 j; S6 D2 N
```/ }; C3 p$ |2 y
$args = array(6 }5 r1 R) i$ E/ v
'post_type' => 'site-wide-notices',. ~; S+ t9 s2 U5 C4 q' D, t6 O2 }
'posts_per_page' => 3,
% D7 b4 \- k$ B, f( {2 V' u1 R 'order' => 'DESC',4 t) d$ z: m; e7 {
'orderby' => 'date'3 [/ P1 e. F3 a/ ]0 y8 l& R
);
( i0 i( r" t/ K R( g $query = new WP_Query($args); Y+ b5 i7 J, G0 ^
if ($query->have_posts()) :
$ V% {& Q" v4 X# D while ($query->have_posts()) : $query->the_post(); ?>
1 l6 F8 w/ P9 `& P% } <div class="notice">
( Z! |. g6 g# K <h3><?php the_title(); ?></h3>" X, d$ s: r! o
<div class="notice-content"><?php the_content(); ?></div>) b# J* M) f- }, @
</div>
% z3 z3 D9 V" ?1 T/ h0 d- D- ` <?php endwhile;% z8 R4 {- H- t' i9 @+ d( s- r; {
wp_reset_postdata();% e. T; [ ^8 A3 D+ r
endif;
# \/ \& u, w: H; g1 u9 k3 P: [; \% N ```
" R) _9 n9 l* G5 z0 f3 P$ k* ~) C6 f5 q+ y9 A, \
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|