|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?, `" [* r- S6 ^: ~( h! P( Z( A
0 y7 u" b2 }5 U8 y8 ~4 j$ H
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
! a6 Y" [4 Y M7 L# {- r& @! W, ]. }6 s
以下是创建自定义插件的步骤:1 n* R: r- ~- O8 n* b( ^
; C+ I; T, I+ }% |7 ?1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
( s" U) r/ s: \8 Y% q- |
0 c+ F% M3 g" [2 {. U+ Y ```
: ?4 H* s3 q' @0 q$ E0 |- q$ @ <?php
0 h% Z5 \# |# y0 N' d5 ~7 K /*
! J% U8 X! R4 ?) f& d4 W& j Plugin Name: Site Wide Notices Plugin
5 ]$ L$ m! ?6 c6 Y3 K Description: Adds a new custom post type for site-wide notices.8 o$ _: g6 A# o8 y G7 r; g1 J2 {
Version: 1.0
( Y& h2 X: O9 _; m7 C% Z' _9 w j1 I, @ Author: Your Name# v5 N, x' V) f, w ]( X
Author URI: http://example.com
2 s. S6 w6 d# R */: v/ b5 ]( o7 h6 n8 `; |( J& j
& Y% m+ L" h, s" w& d; O. D // Add plugin code here...
8 |/ b1 k7 j8 Q8 ] ```
, J0 N3 O' A% _# f$ m+ _% K/ e7 I3 Y4 J, R
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
- m R# {0 f9 h( E1 K% K$ [6 b) S; @$ A1 u0 a
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:4 U7 A) o; \' {( ~
9 y4 w0 |: @9 r& ?& |" k ```
, K$ B8 _" ]( I7 ~# l# R4 |3 G add_action('init', 'create_custom_post_type');
1 b* O2 r/ G0 N0 S4 t function create_custom_post_type() {7 s- c# _0 b. a! W! Y& t
$labels = array(, a* n( o: j& f# N3 @# j
'name' => 'Site Wide Notices',
) y0 ^- }! q) P5 [. n; D. S 'singular_name' => 'Site Wide Notice',$ r* h* Y# _! F
'add_new' => 'Add New',9 Z- O- l/ L- A$ @+ f
'add_new_item' => 'Add New Site Wide Notice',0 N; o* M- C, g
'edit_item' => 'Edit Site Wide Notice',
3 t( {( a1 v O# c# R 'new_item' => 'New Site Wide Notice',
) H! b u* y5 j0 J" e9 g& l3 y 'view_item' => 'View Site Wide Notice',
# a; U! H. D1 _/ K9 D7 e3 Q# b# E 'search_items' => 'Search Site Wide Notices',
4 I- c% A: i* V 'not_found' => 'No site-wide notices found',
8 G6 N: N/ z7 ?% M 'not_found_in_trash' => 'No site-wide notices found in trash'4 F; H t6 A6 \+ H+ i( J
);
6 C) }) {1 P" L) v Y" N! p7 L3 k1 n- y$ O! `6 {3 p2 \3 j: l
$args = array(
" ?+ R4 _" r. R) b 'labels' => $labels,3 x& S3 u' ]- t
'public' => true,5 o: S/ r8 b" F( q+ e
'has_archive' => true, o/ N4 E- \' a% h7 g% a1 n! B
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),, z7 ]' [# W( K) i
'taxonomies' => array('category', 'post_tag'),
& v1 ~5 h5 }" @3 ` 'menu_icon' => 'dashicons-megaphone',% R7 m8 | \9 z+ L
'menu_position' => 5,& i) h0 l. K1 m s4 R- ?. E
'rewrite' => array('slug' => 'site-wide-notices') m/ @& l! {! \& g0 D
);, k+ c* X7 f9 ]8 G$ b
0 v+ k2 @- b" M9 [ register_post_type('site-wide-notices', $args);1 s. k1 a3 b2 k- C; }. v0 J
}4 X5 u" @. T7 v4 I0 x7 Q
```
" F6 g. X. J2 `( k% i
% x0 w; R u2 A) z 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
/ k7 o7 f% X8 E/ x# ?
! e B7 k, Y$ b1 F( ~+ Q9 ?2 I! [3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:( e1 ^& O4 g$ z
) d7 b2 U H+ ]
```2 H7 w3 C% x& ^- `, b& m
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');! U/ O7 K% J' N! x; `1 X6 A* L
function add_site_wide_notices_boxes() {
7 T) e. ?" y. e- q add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
3 Q0 U o! i# K0 S5 A9 i }
5 p; u: |) G9 \" m3 B3 I
5 n* @: `7 t4 F- D function notice_details_meta_box($post) {* v2 s- Y9 P ?. H: {- S
wp_nonce_field(basename(__FILE__), 'notices_nonce');8 q. ~, m% Y& G; C
$notice_title = get_post_meta($post->ID, 'notice_title', true);
. b8 g$ x1 D; j5 [# G- Z! D9 I $notice_content = get_post_meta($post->ID, 'notice_content', true);
3 z% M: l3 W Q, z: v9 J$ v ?>
1 m( Y* H7 B' v& M" @% ]4 h% K <p>
9 U2 ]3 q4 S, L; H <label for="notice-title">Notice Title</label><br>( v s$ z% k% r5 Y; I
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">& j6 E# l" L. r- o1 p
</p>7 ^+ c0 w9 ^1 T% F
<p>. n6 I; }! l+ Y3 z$ V ?& `
<label for="notice-content">Notice Content</label><br>
6 n% Z# R/ G5 H( v <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>- p1 T, D' s9 V. M' A( n
</p>
; U. A( b4 ~6 O0 b% M: w <?php
8 L6 O, T9 D6 s, \( m$ o& F% ?! } }5 x# o: o9 ^* A
* ?& O' j! s: s" [3 e% \: g add_action('save_post', 'save_site_wide_notice_meta_box');
% e O( I$ m; p0 g function save_site_wide_notice_meta_box($post_id) {
/ l* g8 W1 _4 L' I3 J if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
/ {) \0 T# L# O) B$ }( ~$ M return;
! u" z6 i; P7 s1 ^, |: |+ _ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
. M+ `: W' e2 X* ^0 R9 ?3 ` return;0 G0 A! N" [# U% B
+ {, D7 [1 y/ E
if (isset($_POST['notice_title'])) {. V5 B# |# r: j
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));% {/ G! {5 u) \" U. h. }
}
7 m* ?+ L. k+ Q- L! R! _ if (isset($_POST['notice_content'])) {
& J. J, [% w$ g4 k o c9 M& L+ F update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
9 |/ O! A2 p `4 R }
; d [6 X8 z l8 y6 c }# \# D) G3 ]. b
```
; ~8 x) L; w6 {. B- y& t% N' W, d, R+ M0 ^* u2 _4 \3 S1 G- f% Z4 U
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。$ V' }5 `# d! R7 h
- E+ V! M- A4 N' q
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
' ~3 p* k; h q: \3 F
1 C1 _1 M- T4 @! X* V ```
& F& _+ m2 N# s0 O( c- {5 ` $args = array(
6 N$ k `( `! t. f, D- v1 D 'post_type' => 'site-wide-notices',1 m' Y7 i$ t# v/ s
'posts_per_page' => 3, K% `0 b) h5 I* N/ W, B! s
'order' => 'DESC',& L4 \9 J6 p* Z
'orderby' => 'date'
1 N3 R. D6 o7 j- b# K. ` );
7 d0 r) f$ y' k, t9 ] $query = new WP_Query($args);- U# l6 }) o) o4 E; y$ g# t, L
if ($query->have_posts()) :
/ d0 m5 W1 Q/ M; }7 F$ { while ($query->have_posts()) : $query->the_post(); ?>
8 P4 C5 y+ ~( t( r0 n! A6 S7 k <div class="notice">) |( u- S: Y% U# t- s7 b; c
<h3><?php the_title(); ?></h3>1 B2 l( f8 r9 d+ B; M8 C X. x
<div class="notice-content"><?php the_content(); ?></div>
! P) g( Y! N/ p( }6 ~# C' K </div>
6 B) k) _' q" Y+ A' D$ v! I+ Y <?php endwhile;2 U6 y! z8 h. p i( ^5 H
wp_reset_postdata();
/ s) K. G, \6 \1 B. s: G endif;; o5 P, Y6 O, @1 U
```9 C |9 u+ z& g* r5 D
: \8 B7 u. E4 N, V% ` 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|