|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?6 [3 P; Y. n+ \) e
1 q, w# x9 m2 F# P如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
+ Y9 f: r+ L+ Q: k @6 b7 b
. q4 P& s a$ j1 k) R( ^以下是创建自定义插件的步骤:" J/ j' M8 b; P3 E. }7 e7 t# r
9 j, @/ |5 W6 e: h2 j, j. q# R/ K
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:) l7 z. Q# W: P! M
/ g) a) h- Z) d
```' {. ^8 e2 W+ g4 o5 i7 z
<?php) z4 s1 `/ y* N: r. B& b$ _: f3 l
/*: A E W: V$ D7 ~
Plugin Name: Site Wide Notices Plugin
v9 O, E0 o$ I: B# W Description: Adds a new custom post type for site-wide notices.0 @4 b+ o5 ~9 g) x
Version: 1.0$ V& I% \2 Z8 J5 Y/ x( d% f+ @
Author: Your Name
+ j- a# k1 I$ v0 W7 ?: q% P6 S( { Author URI: http://example.com
7 }2 k7 W4 y- E& u y/ i: [ *// Z. M# `# C" t- y) l
" l! V! d% E* N( K- `6 j
// Add plugin code here...0 b4 n; e1 Z; ^0 B% _ R4 [/ L: G
```
2 L! t! k1 W5 c3 ?& {/ Q9 N4 G3 z! }) d7 Q6 F- J% O
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。% h5 b- i& D$ u* X( Y7 b# S* G! B% j
% z# P8 B$ c9 ?' z' U
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:. i/ u# m0 N" U0 h
3 z+ I+ E7 b; |2 y& [ ```
. L, _6 u' `6 K ^( @! ~5 H add_action('init', 'create_custom_post_type');
* J; C2 ~/ X; X function create_custom_post_type() {9 w7 C3 P5 ]3 l4 ^' Y- \/ |% y
$labels = array(
* n8 P5 Z* x5 l' `( B 'name' => 'Site Wide Notices',/ v5 \! a/ \# p
'singular_name' => 'Site Wide Notice',
- m6 {) B* r! \ w8 W1 S/ M 'add_new' => 'Add New',% u r% o# y6 i7 c; ]6 L" ~4 K
'add_new_item' => 'Add New Site Wide Notice',. `4 B8 p# _* K4 {9 S+ e
'edit_item' => 'Edit Site Wide Notice',
6 ?; Y+ V+ X" Y9 H 'new_item' => 'New Site Wide Notice',0 ]9 R/ M# H" K
'view_item' => 'View Site Wide Notice',+ k& d0 a% X) b3 I" p
'search_items' => 'Search Site Wide Notices',9 f" n% W, J, g) H( B. _
'not_found' => 'No site-wide notices found',
; t3 A! ^4 z' c9 M& d9 F* m5 i- C 'not_found_in_trash' => 'No site-wide notices found in trash'
9 `* L# Y9 m- K2 R( W: M );- |, |* j! [9 ^" R+ Y
+ M3 q5 s" L3 ~% @' ^ $args = array(; n0 x2 U) b3 U w4 @$ V
'labels' => $labels,' M F2 y8 V X0 {: V
'public' => true,* Z( c, V& L& G3 [
'has_archive' => true,4 z7 P; F" j/ a8 k
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
* V& f% f1 C3 } 'taxonomies' => array('category', 'post_tag'), o6 i/ K0 D$ B2 [% @8 ^
'menu_icon' => 'dashicons-megaphone',' h3 S- n/ {! V' }6 ~
'menu_position' => 5,
% o( f! f! T: h' t1 U4 M9 T* C 'rewrite' => array('slug' => 'site-wide-notices')
) e2 u, `$ i C2 s+ W );) S2 Q4 A: @! Z5 ~" G. a# P2 r, y
4 Y) o$ J7 p5 N4 A register_post_type('site-wide-notices', $args);
1 [/ {, y$ @2 r3 p }9 p* O7 c. \% _( K3 T' C/ M- |
```
7 n+ F* @2 e( O2 m5 E) ]6 t9 x j6 F" a0 ^7 V( B! U9 [
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。# w* E! o+ Z1 p3 d
& H/ X6 N# Z/ @: _; u# j3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:" Q( e1 b, M0 `7 c
# n9 o2 e+ R4 n
```
z' t- i$ |2 q/ X& C add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
, k1 O, n2 L0 q/ k8 `' A( Z9 C4 v function add_site_wide_notices_boxes() {9 B; M- f7 K0 T. x9 Y
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
* H) a$ m) Z; o }% F0 p* B' H- g: o
0 ?3 ^/ v! k2 U
function notice_details_meta_box($post) {
7 J4 z* V, C# s wp_nonce_field(basename(__FILE__), 'notices_nonce');
' s. D5 k0 M$ ?1 o0 H6 I' A $notice_title = get_post_meta($post->ID, 'notice_title', true);
/ l7 f" G8 s" B* E. a! y $notice_content = get_post_meta($post->ID, 'notice_content', true);% T3 u5 q0 s% g: Y! j
?>
) }# O1 p7 [' _: P) D& H <p>
: d6 j2 R6 \! Z- \ F <label for="notice-title">Notice Title</label><br>. ]1 q, J& k9 Q( V! `" Y( P
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
U! g6 r, m/ I1 r5 K9 ^! d </p>
q. A( a. Q+ j+ U# R* S6 ? f <p>: M" \$ a- N* T
<label for="notice-content">Notice Content</label><br>! @4 K% |5 f- X' X( _- f
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
0 a% s; C: ]- D8 h! A </p>: b6 k5 M8 ~" [% l2 v/ o
<?php
# F2 v5 f) x) p. l$ Q" V; v+ z }
+ ]% U) P/ b; S+ u( M( Z
: o# Q& u3 X' F2 G( u6 u1 _ add_action('save_post', 'save_site_wide_notice_meta_box');
1 `/ C5 y3 K7 }$ N; N1 l: ] function save_site_wide_notice_meta_box($post_id) {
. H# `8 u4 a1 \0 A7 |8 ~ if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))/ K/ t" i, W6 \% C+ w X
return;
3 B, U' @2 O9 r& ]: u/ i/ ^ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)0 m. V8 [) y% N6 _) N$ N+ |
return;
* Z n. p: Q1 { ^' |
6 y6 M5 {% U+ h$ _* @9 i+ o9 X( R if (isset($_POST['notice_title'])) {3 Y2 z- S/ J" H! B5 R: M& C3 B
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));" u9 M7 B1 I5 Q) H" {" V
}
, g% t) o3 J' ^9 u9 F if (isset($_POST['notice_content'])) {. B; n3 I$ n6 J/ z* Y- R1 b1 x& G
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
6 k1 q3 p7 U) X' E. j }
. o1 T* T, T. i& M2 M e }8 E2 X2 {5 ?) l+ {* ?
```
/ t( M' K5 Q( e! e6 I- F) x
( o3 ^0 H# u; U( a/ P' F 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
. j5 A& p6 V! Z* y6 ^, p- R1 _4 l* ~ B9 F0 ~2 t
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:( u/ L, ~# \2 Y% e8 t5 X: j- D, r
: t& \# r; u/ _7 l6 D8 w& v ```
, {# { \ t9 K" m3 K% N $args = array(
& r! |8 P" ]% ]; Q, D6 x 'post_type' => 'site-wide-notices',
1 L' D: x2 ?4 y) m! S 'posts_per_page' => 3, Y# l {. g2 N0 T
'order' => 'DESC',
& I+ }& Y, q+ X* y 'orderby' => 'date'5 \6 V7 y2 z$ ^( n/ r" ~
);
, I1 U7 q; M) {# ^ $query = new WP_Query($args); H4 T X( J5 l" a! P
if ($query->have_posts()) :) V: L* Z$ x/ _/ f I/ N; V( T
while ($query->have_posts()) : $query->the_post(); ?>% ~0 M3 ^; T F4 W
<div class="notice">
E7 V) Y/ X5 T: h4 m9 E <h3><?php the_title(); ?></h3>- _9 z, f* a/ w4 _0 V' B6 {1 h
<div class="notice-content"><?php the_content(); ?></div>
. p b* Y( S1 X) }) u </div>
8 D8 O& p4 ?9 T G <?php endwhile;; T& c6 S/ b9 e7 L
wp_reset_postdata();) }$ d; |# m% m( x! f9 U% k7 R
endif;$ s8 e/ S2 K5 `6 B% I: s A
```- P3 D3 ~# j6 c8 U4 d, {
& E0 M6 m4 O% ~8 ^7 `# l 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|