|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
- E8 n4 p# b. o' }5 h4 D
# p* V; ?) F8 D0 K( P如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
# i/ d q! R2 o6 K4 p- A2 U& o6 A
0 s ?. a0 y8 p以下是创建自定义插件的步骤:
6 L5 ?; H! A* n! T( H. G" w) }# V' W" @+ _4 y2 L/ n
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:% _$ w# |& S5 s" N
- y$ |" ]8 y( e6 o ```
4 [3 C# |+ A, f* R4 ~4 U0 u <?php
+ l" Z& J M7 V# P /*# k/ m0 e/ T) x, L. R
Plugin Name: Site Wide Notices Plugin3 X, G- z# c6 z
Description: Adds a new custom post type for site-wide notices.
& [6 Q4 I9 o% h. y, P4 E4 ^ Version: 1.0
' T4 j, I' Z. _7 \( d Author: Your Name- F: ^9 `$ \, B' `
Author URI: http://example.com1 T; c/ u/ @* ]% ^$ P. o
*/ d& x" X2 t# t& J
7 y2 P! E2 E/ F$ u- c' {6 I
// Add plugin code here...; K/ _ d$ e6 t, r8 G2 ]
```
( R* t7 [6 M* b4 {
8 ]. `- C/ d1 y Q: f" n 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。$ r: M& i& |6 |. d- F
4 D; s, l. [1 I, A, V5 b6 j
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
% L+ W/ A/ q0 Z- G7 T" u0 v4 d/ P8 Q8 G; J6 r! t
```
( L. b* Z& ]' a5 u1 P add_action('init', 'create_custom_post_type');
+ |6 U" F% x4 S/ A function create_custom_post_type() {
! g% b K7 m" D) D/ j $labels = array(6 W% t4 g( F0 r6 S3 R- w
'name' => 'Site Wide Notices',
6 B- p: G" O5 E1 V9 \5 \% W 'singular_name' => 'Site Wide Notice',
. z9 o0 ^* b/ N" G 'add_new' => 'Add New',. P$ R( R! q: J, P5 G$ T( p
'add_new_item' => 'Add New Site Wide Notice',
& r/ z$ C# |. D 'edit_item' => 'Edit Site Wide Notice',
: t0 I+ }$ @# i9 t! B0 {2 \ 'new_item' => 'New Site Wide Notice',8 d5 }# `* l7 G M( w! Y& {
'view_item' => 'View Site Wide Notice',
, l# H1 M1 G+ ~/ A, c- y( l$ q- I 'search_items' => 'Search Site Wide Notices',
- V: |5 [' a" T3 W6 {3 g2 B 'not_found' => 'No site-wide notices found',
7 O2 w# N5 _; D0 S# F 'not_found_in_trash' => 'No site-wide notices found in trash'
8 t3 s, A) a5 Z* C3 E: ? );
" F! E" _: A6 v x6 l. ^$ k1 g& ~1 G
$args = array(
/ ~& n6 p$ C" h7 Y4 u3 U' s$ a! ? 'labels' => $labels,
1 n$ E, b, u/ G2 I% Q 'public' => true,
; a3 T2 p; ~2 h+ d7 f 'has_archive' => true,% g, B G& Q9 E# t! n6 o) s
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),+ C5 l/ k# f) b- z
'taxonomies' => array('category', 'post_tag'),
* T t V" m6 R( }5 s 'menu_icon' => 'dashicons-megaphone',
9 [9 e7 Z: \, c4 J3 _ 'menu_position' => 5,3 S7 f% f7 |4 E3 L, c4 d5 O# q- Y
'rewrite' => array('slug' => 'site-wide-notices')
5 V$ { k0 T; ?& u1 {* [, L );5 J3 q+ ?% S$ o, Y5 |' M1 B
: ?8 l! h; l& B' S register_post_type('site-wide-notices', $args);
2 U8 E# p; x% v) a: z8 Q8 T& k }
, s% W e5 j, L- B. Y& \ ```
. a% f3 ^3 O: G' D) H" m
" @9 D5 `: l* A6 v: i* e! F+ X3 k 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。4 u- U( M6 P/ K& A; Z
% y3 K: n q3 @. j" B$ l( H
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:4 j* Z- e8 Y/ \' P6 U
/ B9 d3 m& N# m. O% l; {5 \
```& N6 x$ U) v6 _
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
/ W, `& N9 w* t0 h function add_site_wide_notices_boxes() {5 w' `& D; u7 Z! P4 R! B$ D
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');1 o$ g/ h2 L4 ]- x, r7 Z
}8 m. |. a* s7 Z$ }
6 s9 ~% { g/ y& q% { function notice_details_meta_box($post) {* k0 P! | q! z, W0 p( R
wp_nonce_field(basename(__FILE__), 'notices_nonce');4 f8 H& u; W I) ]# A
$notice_title = get_post_meta($post->ID, 'notice_title', true);* \) m% C# l; X
$notice_content = get_post_meta($post->ID, 'notice_content', true);
T1 Y5 g: }0 W4 F6 a ?>" F6 ? E/ l' u% Z0 @8 C
<p>0 {- z/ s- |$ J, s, }
<label for="notice-title">Notice Title</label><br>5 F* E7 U% }" Z6 N) P+ j: D
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
" [' _2 b1 _" ?9 q; L _& C </p>2 L" c6 \; @6 I, F4 t* i1 M
<p>
4 C) \1 u6 K1 U( @, r& B* h. ?2 z <label for="notice-content">Notice Content</label><br>6 x7 o% w' l1 d0 N
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
7 R+ O& _1 a! d </p>
) Z# Y3 H5 M4 D <?php- m2 X! s- K8 h
}
. l3 R/ N; I7 A/ o" I+ X. ] c. U, }: T% p
add_action('save_post', 'save_site_wide_notice_meta_box');1 f& {$ x1 i$ E3 S$ X- B& T. C
function save_site_wide_notice_meta_box($post_id) {
# P( `/ i. P9 g) ~8 J if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
5 R4 S; m m" ? return;
) c" x, ?/ s* {4 ~$ }" k( l" h; W$ z if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)1 M" t5 C! A; s- b- z, P; L7 A
return;, @ `8 N" t8 g
) r, B l7 e% ?/ ]- |3 p if (isset($_POST['notice_title'])) {
* i& b9 S/ p9 I: H4 ]6 P update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
3 \8 D; s7 W/ X' _! j/ [9 S. g' @/ L }
" u/ V4 v# ]4 h$ @' v if (isset($_POST['notice_content'])) {
! M6 s9 W0 @& F+ I" F update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));8 ~: ^! C& m* g9 X7 _. Y' C
}/ O5 Q' n$ N8 z/ A
} J5 g K6 f" h' Q1 k
```6 [" A! s* x7 {4 }' |% m0 i( \
F# l" f) c1 _- C' h
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
; l5 |& z- U/ z- U4 O+ l$ v w7 ?; F
( g" j; ?0 T% m9 g4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:) N7 B; l5 |; y N! f
0 O9 G5 ^( q5 j4 c0 j5 P0 y
```# O6 K/ E8 w9 `5 \& m- d* ^
$args = array(" ~( W A$ L2 `. S Y7 V: I( a
'post_type' => 'site-wide-notices',$ X2 y1 D& Y1 t- z2 J
'posts_per_page' => 3,8 k1 r3 q9 T7 g! T/ I
'order' => 'DESC',* Y$ g n- I- T/ ~! f; P1 j" H
'orderby' => 'date'
9 ^- {$ ]8 S6 U8 Z );
% M3 c j/ n8 V $query = new WP_Query($args);1 q6 J1 _3 x" g
if ($query->have_posts()) :
9 P+ ]& {0 D( m7 ~0 N while ($query->have_posts()) : $query->the_post(); ?>8 T& g! ?8 ]0 ?! p6 R
<div class="notice">9 r7 F* P6 a( n5 l; g
<h3><?php the_title(); ?></h3>; B* k( M+ C; I. W; D3 t5 e1 K
<div class="notice-content"><?php the_content(); ?></div>
* _0 Q/ L1 ]8 c" k D( [/ s' J </div>5 u1 I0 ~4 a. @* |2 s# @
<?php endwhile;+ r( N. o+ z; v: A; S1 X! x
wp_reset_postdata();' o, ]9 \3 T* }
endif;: t% N5 e: K { x6 Z+ O3 {
```
7 Q* b# D) |9 W3 b
; m( K9 x. k5 [4 g0 R$ }) V 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|