|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
! N( F4 ?/ x1 [, O
R' _0 r+ i* F h如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。+ D- P: R, z: S, g
* [: l( h* a8 z- d
以下是创建自定义插件的步骤:
: }2 i+ A6 f) N* a/ Q7 n! k
) B3 z; X% y$ W) u: B1 v8 D1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:; `3 J5 m G; Z) ^* h7 M
3 x* s8 C- {5 q, J
```' U5 s j- z" f" B/ Z
<?php
1 z) h" E9 d, V( u; l; W$ E. ] /*
& Z' m1 ^' d& T# \, b Plugin Name: Site Wide Notices Plugin0 y! E# Y6 k) [1 W
Description: Adds a new custom post type for site-wide notices.$ I% L4 b! B6 D& n- p# b& X; d
Version: 1.0# c8 D, G4 P, d. W+ Q( {. T
Author: Your Name( W( p. \& y, I5 [3 H3 b
Author URI: http://example.com, {$ `& z2 K& C C1 a* v$ P/ M
*/" v) E, H1 j1 q, U
( H8 R& G2 z! A. t // Add plugin code here...; W" m: p. u" y# l4 }7 d2 u) T
```4 o7 ^3 o# U! j/ t0 [- M
5 D0 D! L- S4 t& @
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。" \" k- b. q( B. N7 C2 {; B6 H; S- M
( [1 N+ e: y" R/ ]! a& D2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
$ r0 S. ]. o1 Q" _4 I
# ]/ W* `# H2 L, u$ w& |( y6 N ```6 a* `' N9 ~ {* d* X# K) g
add_action('init', 'create_custom_post_type');
% w; S) @ D" u! N/ f; E( r5 d function create_custom_post_type() {
5 G' B: ]/ G0 e; E# n $labels = array(4 X( z- ^' r" y$ z9 K! P8 D4 |% b
'name' => 'Site Wide Notices',
+ {9 I% b3 ?( \5 X 'singular_name' => 'Site Wide Notice',
% z- {# A4 D; s2 @ 'add_new' => 'Add New',7 y/ [( @1 m: n. t$ r5 ` Q! Z3 _
'add_new_item' => 'Add New Site Wide Notice',
& \. p9 N0 h% ^6 F' Y { 'edit_item' => 'Edit Site Wide Notice',7 M) l7 X. L3 c0 U7 T8 |3 R
'new_item' => 'New Site Wide Notice',
$ p; k6 s" Q8 e; e8 m8 a+ H7 I( j! @/ R 'view_item' => 'View Site Wide Notice',2 ]" W" y" t& ~" M/ d
'search_items' => 'Search Site Wide Notices',
+ ?5 c0 X4 _2 L3 _ 'not_found' => 'No site-wide notices found',, R3 \1 }2 r2 M: f
'not_found_in_trash' => 'No site-wide notices found in trash'# X+ r4 a0 U" Q: }4 `$ O
);5 g- L6 X3 k; D& ^9 C# ^
- C$ z2 z) b7 n% X5 {9 ?8 v
$args = array(8 @! a# T; u. @( X0 O7 C. P) L
'labels' => $labels,
0 e- U/ Y1 r j 'public' => true,9 I. E& \5 H0 k, i% K% H. \+ V
'has_archive' => true,
( l; @- m) t) g p! X 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),( _% G0 \! ]$ \, \% ~$ s6 R
'taxonomies' => array('category', 'post_tag'),9 E0 n, p5 k; C! c; H. K
'menu_icon' => 'dashicons-megaphone',
% |# v; q3 g; W. L4 E4 E: C 'menu_position' => 5,7 i3 y. U. X+ ~- j# L% _* X, n; @# h$ i
'rewrite' => array('slug' => 'site-wide-notices')% p- P3 e0 b2 [& y3 K
);1 g6 i3 C: Q1 T- P
# _5 A5 s; E; H register_post_type('site-wide-notices', $args);
9 ]* e- a: m& [% X; H9 z( w4 g# l }3 \# H0 | O7 F0 O- `3 ^
```6 W6 S) `3 j( {8 i
6 g" |. c, Q/ l) ^5 s 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。 M9 r% k8 n/ R# o# G8 f4 v
. y8 C2 x" f; ?2 S
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
) \! \& y) K4 H9 [7 y4 ^- u$ |
% U) c4 j* ?( b+ }6 j2 u ```7 P/ U% `- n" t p9 F( j. X4 B s
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');, t4 z$ U' V' Y2 h3 ]) D
function add_site_wide_notices_boxes() {( W* h/ d3 K, ]7 A3 y1 y) I
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
) C: `1 U+ q% q- r6 R* E2 E }; z R. o. k- H
7 P `3 f u. f' i \, l* ?
function notice_details_meta_box($post) {
/ i" w) W6 D e& `1 `7 r8 }7 M j4 O wp_nonce_field(basename(__FILE__), 'notices_nonce');0 s7 {( S: ^3 {+ D: s
$notice_title = get_post_meta($post->ID, 'notice_title', true);6 x; B5 C+ c1 b; g; @$ E( r
$notice_content = get_post_meta($post->ID, 'notice_content', true);
9 V) F# ?! n% Z$ ]7 h ?>
; X5 ~# [- a: v) |2 O4 U, P1 u- q <p>
) p5 r o. g/ ]$ s, e) I <label for="notice-title">Notice Title</label><br>
, X# j8 ]6 J" B <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">+ P7 B, ^0 c% k: Z$ K) j
</p>
& N j/ p# t# J, [* r6 V1 k9 Q# `; y- E <p>
0 ]( O6 h* W* m$ I <label for="notice-content">Notice Content</label><br>( D* l2 B/ K- E& k
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
9 [3 g, c2 r$ `+ r* E6 h+ F </p>0 h) b* x" M# r- m
<?php
9 R7 A7 h( u4 {& V, f }
9 S. I) x- b5 v' R$ g0 i
3 \* ]' Y$ |7 _2 M* p add_action('save_post', 'save_site_wide_notice_meta_box');
/ U% j9 b/ o$ O! p function save_site_wide_notice_meta_box($post_id) {
9 Q$ N; {9 Y/ G: Q0 R if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
/ L# T2 i K$ c. k return;
k" x9 U6 M4 M' y9 w. @. h if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)" w I& N6 C. O, t3 b2 R/ f) P
return;) J5 G' `6 a. N/ E3 }
# R1 ]' W/ |6 ], o/ {+ `. `, Z
if (isset($_POST['notice_title'])) {: R( n; _0 s" m. M8 X
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));9 ^" G( _& R7 X/ g0 w( Z
}
9 I5 D5 Z1 s! ], W5 m if (isset($_POST['notice_content'])) {
" b# x# g* M: [' W7 f; \5 C update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
) T) g3 w- H/ v. o }; m0 G: _2 ]2 U! c9 G
}3 W3 S6 I( c# s: t; L \' g
```
! W. J3 @4 E1 v, |
) Z6 H/ ]# Y$ H- j4 A& T 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。9 H- T6 a* @6 K' _, V
3 D* R1 r$ i7 [: x( J% \5 F, [4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
5 o0 b) `! Q q; @6 K9 i) j
+ K; L! W4 ~, t: ~ ```
; d& J& Z; |2 y6 j $args = array(. O( @' f/ j& \; R
'post_type' => 'site-wide-notices',
* d. h5 H1 [* u 'posts_per_page' => 3,
$ ~; A7 H2 t' n, [* {6 n1 Z 'order' => 'DESC',
6 ^+ ~ d' _7 {. t/ l |' u5 ` 'orderby' => 'date'
8 @. j E& h! c5 s- O );2 F: G* L; |7 H0 m$ W; k6 u
$query = new WP_Query($args);' q Z8 b2 f3 Z8 E" t' [; v
if ($query->have_posts()) :
9 ^& r7 K T- e# m0 B0 g while ($query->have_posts()) : $query->the_post(); ?>" D" I P, M$ E* l
<div class="notice">; Y5 _- G4 v( ]3 s/ x6 o
<h3><?php the_title(); ?></h3>
* b0 c; q8 [/ a" T7 o2 l ^9 _ <div class="notice-content"><?php the_content(); ?></div>
4 v M9 k9 p1 }* F8 t! e </div># f7 a- Q6 R. H" D. u
<?php endwhile;
6 u# `+ i" b$ \7 P9 X2 H% S wp_reset_postdata();
% M" e4 H) B0 D' w2 e9 \ endif;
% m9 Y1 E3 Z) ?1 H+ z$ B ```: l( Z2 @9 ]9 M$ t* Q4 a! \
' h! p; E1 t: _0 s' A, j2 b. \ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|