|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
% ?& j' @# j% x6 |% ~0 \ f
4 A6 F. F: {4 _. ?( C如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
, S( z6 ~) I4 u4 W5 z
* I2 h8 |( x; }2 `以下是创建自定义插件的步骤:1 \. y/ |+ I+ y7 L( K f6 g" }: M, Z1 l
4 i) C, u, c! R' W9 `: B
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:1 {% l6 n {) @/ J
) O5 a( E1 O/ ]- M- f4 Q( r
```7 `. j. D. C. v. s9 z: l; h3 j
<?php
8 y- q# M, A9 r /*1 h. l5 |2 P) ]4 K
Plugin Name: Site Wide Notices Plugin8 U7 o. o( k' x4 B r" x
Description: Adds a new custom post type for site-wide notices.
; y+ B% b" H/ g: |$ e& [ Version: 1.0. o6 U" [4 g5 ]" ~0 Y p
Author: Your Name: p7 y: s+ D p; G
Author URI: http://example.com( {$ u1 G( K4 w8 C
*/" n5 j2 f. ~/ V% p( w+ ` Q
' v( y4 T3 u1 u' S% A8 A# c5 \9 b6 a
// Add plugin code here...
/ @& v$ a" L! P/ w( ^+ | ```
- O, s5 e/ S2 e& c- F( }5 Z2 H$ ~7 I) D- w2 E, q
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。0 [! L0 D. o1 R1 _& @7 z
f! }$ U. \7 C3 V' W2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:4 X o& z4 m" q" S) J# e
0 _/ L n9 d' Y: ]% v% b; G ```
4 ?7 ^: E# v' G: _, X6 F6 p add_action('init', 'create_custom_post_type');
0 i2 s+ V+ t' _ function create_custom_post_type() {3 w6 _) n. Q9 M
$labels = array(6 J. X0 m9 F8 d, R% _4 J: c( [
'name' => 'Site Wide Notices',: f! F t& X; e2 z
'singular_name' => 'Site Wide Notice', K7 c! v) {# q* D9 m
'add_new' => 'Add New',8 V2 g( q$ H- V1 w6 o
'add_new_item' => 'Add New Site Wide Notice',
) W+ E6 m) a4 R& B1 o6 l! z! y% Y) q 'edit_item' => 'Edit Site Wide Notice',: n0 K5 h7 I" }* s8 I/ P/ S$ x/ I
'new_item' => 'New Site Wide Notice',$ v) q0 l1 C$ b0 o
'view_item' => 'View Site Wide Notice',
: E& [! K8 [+ E 'search_items' => 'Search Site Wide Notices',
5 m% T6 y8 s' g7 w& } 'not_found' => 'No site-wide notices found',
! w" a7 X" C8 G2 G' [# V" A 'not_found_in_trash' => 'No site-wide notices found in trash'
# }+ K& Z9 v7 U+ b: N) T );* o0 N- G0 s. i+ O
/ A* s4 Q* q1 \* p3 g7 T
$args = array(7 s1 W' D% G Q* f; ~
'labels' => $labels,
2 c8 m5 ~3 N v5 |% G* u+ b$ y1 j 'public' => true,% m* c+ Q! f$ t$ b D5 _
'has_archive' => true,. a1 k6 E1 f" N0 ^, w
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),/ r4 {# G, ?5 _
'taxonomies' => array('category', 'post_tag'),
4 ?2 P! r. ]' Q9 X } 'menu_icon' => 'dashicons-megaphone',' u! K. @( z4 \, d; ~8 `" m* l
'menu_position' => 5,( g5 M5 Q( a0 l3 Z* |- S; \: F
'rewrite' => array('slug' => 'site-wide-notices')8 _* F, m# ]/ {3 F( |5 N3 H: Y
);
" |8 t4 h _* ^$ q
' X1 X! \7 m6 u& z3 I& m register_post_type('site-wide-notices', $args);( P0 @- j! {! `8 t$ a
}' j; n4 A% |( B, {6 W% d
```
/ E" p% R; K. V( ?& M" f
7 Q& I4 o# z) v. ^5 G6 O2 m( \. | 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
8 `3 k. c+ ]) I- B" k- a9 A, p
: E2 K5 l2 o" u! P$ w3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
4 T- u$ ]: m3 X# N; w/ ?; e! m) U
6 K0 g+ t. }0 R5 j0 ` ```
2 \$ J0 P# E+ n6 S" I; g: C add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
5 _/ A7 Z/ ~- P% q# ~( v6 S function add_site_wide_notices_boxes() {
4 W7 }; s! v( s0 Z, F7 d3 e add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
9 t; g- q3 I9 ]+ T }
* h; K% g) q* X; T, g, \) C3 |
% U! ?% b! a! j6 } j function notice_details_meta_box($post) {
4 J: z7 i# K5 B/ R wp_nonce_field(basename(__FILE__), 'notices_nonce');9 x7 d9 V9 S9 q0 m9 g4 g
$notice_title = get_post_meta($post->ID, 'notice_title', true);) ~& l& s( S' t# `" W
$notice_content = get_post_meta($post->ID, 'notice_content', true);
- q% }# W# N. j9 c$ V ?>
8 A; Q( w8 {7 c <p>
$ v+ l1 q1 t# K$ U <label for="notice-title">Notice Title</label><br>
0 S* Z3 v6 |2 f, n <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">4 I8 l% @* I: R) F) {; w
</p>4 `1 j! Q. \2 B5 W
<p>
. ]9 q, \) c1 o+ i B <label for="notice-content">Notice Content</label><br>
8 w: p: p0 ]! k6 R: c. j( y2 W# p! Y <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
( { ?+ U+ ?* D4 Y6 L: R- g; I </p>. S( |) k4 H1 Q, H* c) k+ s$ ]# V1 {
<?php( c( k0 L1 A- D; X1 R% c
}/ z: p4 D, H B$ v. ~
* @ t- C0 N. I' q) L- [8 p add_action('save_post', 'save_site_wide_notice_meta_box');5 g+ ?7 b7 d1 ?! y+ O; F! K0 B
function save_site_wide_notice_meta_box($post_id) {
9 y0 [: G: H& W3 L3 b9 [) g/ T if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
/ P# C. S" s$ H: _ return;
# {5 J# R' ~" C7 W if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)+ O6 G9 X* t+ Y; _# E& t
return;
9 j) v; i6 ?+ `$ R! f2 X! i0 e- P I, {% p- }- ?7 i! k2 w
if (isset($_POST['notice_title'])) {$ c/ N/ B+ A0 B' J6 M* w' R: r
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));8 [1 F4 {& m2 |! c- V% ~
}
) C0 n N ^. R5 L$ H) R if (isset($_POST['notice_content'])) {8 A; K) \+ N1 b5 p+ M
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));1 I8 Z5 d* w7 L Q
}
8 U8 T; c c+ M }
$ j) G' @' a" e3 O* Z, N; o9 P+ L1 Z ```! T& o2 _3 c/ o
6 _4 n1 Y I; \7 Z& v3 d( r0 | 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
' X' i5 e$ S: `# D6 G+ r
( y7 Q4 y ?/ N: m% U4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
7 x9 T" k# e3 F/ q0 p# ^' d6 s3 k. |* B6 T) M2 w5 C/ ~
```
7 O7 G( X$ M8 J* J8 _ $args = array(
) X( t! h1 D: h1 }( F' u- j 'post_type' => 'site-wide-notices',
- S. O' e+ k. s- d. D. N 'posts_per_page' => 3,
- t5 h9 C x, p 'order' => 'DESC',
2 m. m! g: q7 b6 c$ E( U5 b" D 'orderby' => 'date'
0 e( F9 \" y0 l4 l: w3 I: X );
3 U$ i3 T. g3 c/ G8 A- [' N! g $query = new WP_Query($args);" A8 Z1 u& e% b+ W5 P' u" K
if ($query->have_posts()) :! `' Q8 v. y9 w1 Z' H% p/ ~) c4 R
while ($query->have_posts()) : $query->the_post(); ?>0 C. G! x# d* q% e4 N( `/ F
<div class="notice">) z1 W( g5 u2 {7 c
<h3><?php the_title(); ?></h3>) `, {9 f6 g$ K/ t: d L( |
<div class="notice-content"><?php the_content(); ?></div>
# Z w, g. Y! J% [" S# G </div>
c$ G! O+ e0 E1 Y: t <?php endwhile;
/ Q o+ ? j$ ?2 Q% \: W# c wp_reset_postdata();6 e- x) l; a% i, R0 K- r/ j
endif;; n( B# w# f( f. {7 U
```
3 q H) g+ |4 c4 C [
/ y& p5 Q B# @" B 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|