|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
% Q2 Q4 Y: i/ U: ]: t2 S) a+ D! p/ I8 v$ u. j6 V/ P: h
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。9 [) D: U! L1 o/ a v) M7 w0 @$ d5 X
3 C7 c' ~6 s8 ]- g) j
以下是创建自定义插件的步骤:& z p$ y% ^* f' O& H5 o: l
- n2 D8 c$ Y/ b; V0 g3 q; y
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
- r* z# d/ ~* V5 y3 K' T2 k I# q, N/ P
$ J) @8 F3 y6 }' i% g1 V ```' C; [5 Z* H7 R$ j B
<?php5 a6 j/ L# R6 H3 p) a! p2 Y
/*
; D& L! B) ]5 [& A Plugin Name: Site Wide Notices Plugin
4 c5 z& u- }$ o$ c, v Description: Adds a new custom post type for site-wide notices.
# b$ J1 E6 D7 q D, q* a) B Version: 1.0
" R9 q% U- N- y7 G3 a Author: Your Name6 G! q- H$ a9 s2 L9 S$ R
Author URI: http://example.com
' ]% q2 e0 B$ m( M0 R i) Q0 A- C */" ^8 {0 l9 w. i% @6 A
! {' O& w$ G7 P& g# k' w // Add plugin code here...
: U$ E" N$ z0 a0 Q4 b# u ```4 ]3 k- h& A5 _. q
+ B2 P) \( \* C. g2 s3 t
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
) V3 ?+ S! }+ A! p1 X: O6 ]
( n% y; E9 Z# [ O2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:. B9 [( i+ z P$ u. w
@7 b. y; O" ?5 O
```3 h" Q# ?) u, S
add_action('init', 'create_custom_post_type');, j! E0 Q* E7 H% s
function create_custom_post_type() {
, ^/ x, P' ?) A2 H j $labels = array(
$ D7 L8 W, X: q( I) X; { 'name' => 'Site Wide Notices',6 h, w8 G" U9 K4 l+ }1 P$ P u
'singular_name' => 'Site Wide Notice',: Z2 { T. ^; |# C, w7 |
'add_new' => 'Add New',
3 k# W2 e7 Q1 K' t4 D 'add_new_item' => 'Add New Site Wide Notice',3 U0 f4 q/ s# l+ y7 d9 R
'edit_item' => 'Edit Site Wide Notice',* U( R N; d% I! [5 [, e! s
'new_item' => 'New Site Wide Notice',
! x8 c5 x4 ^7 ?) J7 k. ?, K8 x 'view_item' => 'View Site Wide Notice',# r3 @" P' ~7 W9 D8 t9 O9 n G
'search_items' => 'Search Site Wide Notices',
& l. {5 w) P2 Q% b2 H 'not_found' => 'No site-wide notices found',/ c: u* ?. A5 I; p
'not_found_in_trash' => 'No site-wide notices found in trash'. Y" R6 z U+ G6 o/ ]9 a9 {6 ~! o6 A
);/ F* F9 |+ k: F5 d1 p
- J3 G- |8 p$ ]5 r$ F $args = array(, D D# x( l" R) r* H1 ]
'labels' => $labels,
$ J7 ^ i2 U/ ?4 ` 'public' => true,
$ `8 U+ K" k+ I+ [ 'has_archive' => true,
5 |+ r' A$ B. a% e9 C! r 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
4 y' `( [! o* X$ V8 Y! G; F 'taxonomies' => array('category', 'post_tag'),, t5 K3 f8 e( L9 m6 e1 x0 `$ m
'menu_icon' => 'dashicons-megaphone',
) H! `7 R3 [# t, V. |- J# Q 'menu_position' => 5,
. I% B0 f: N0 W0 a" X) N% r 'rewrite' => array('slug' => 'site-wide-notices')
' O# w3 D, k+ j- K" H );! C5 Y, c; \6 {; p& f! Q
# T9 l( D# n% \2 ^* d8 ^ register_post_type('site-wide-notices', $args);
0 x ?) g2 I+ Q6 N8 g1 B }5 k- i# x2 P' r* W. P4 v; a
```
. s1 O/ ~: o+ Z7 Q8 N _ h" b$ R8 X9 \, s+ D$ K
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
- |0 q- `/ S' y5 A$ `9 S9 l: `- k1 I7 x2 u2 @! v
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:% g2 t4 t) x9 F% Y
; F( M* C/ |6 i& y/ y) k* p c
```
/ Z/ R7 C* f0 v: o' x+ K add_action('add_meta_boxes', 'add_site_wide_notices_boxes');6 H* N n: g* ?2 F
function add_site_wide_notices_boxes() {5 w# \9 r1 G; a4 U- e. h
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');9 q5 ^, x+ D2 v E
}
* Q; R. Z4 y2 K# g
; h" s8 C, V" i$ v function notice_details_meta_box($post) {
$ o- G$ K& q6 Z+ ] wp_nonce_field(basename(__FILE__), 'notices_nonce');8 o! U$ A) M8 r3 B+ S
$notice_title = get_post_meta($post->ID, 'notice_title', true);7 a/ y. \0 x/ ^9 t. A
$notice_content = get_post_meta($post->ID, 'notice_content', true);5 A: L, ?! o: C( a4 w
?>
# x' D& `2 c3 X$ a+ M8 X! \ <p>9 }+ i9 ^6 w) b. D3 t
<label for="notice-title">Notice Title</label><br>; }$ Y6 o% i0 h/ `2 C* p( S
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">: |$ g+ Y+ h$ a: g9 W: x
</p># |$ x) n7 n; p
<p>
0 ?6 C- y" o& L' s+ k8 { <label for="notice-content">Notice Content</label><br>
3 s. `& Q9 |' _, O <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
: `$ K+ y) f2 k, ~6 V% i </p>! k: V7 _: w% _. c
<?php
0 F8 F( R* l; _2 ] }; ?# Y0 I3 \- y- d& e0 b
' k- f" M/ n2 {5 \ F$ y. _
add_action('save_post', 'save_site_wide_notice_meta_box');) _ B0 c# N8 D# r4 c4 l5 b1 Z8 _- T
function save_site_wide_notice_meta_box($post_id) {. C0 G- f" d5 t) m0 T, ?- u! {
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))8 ]3 m' y7 O/ f/ Q* `# D* {
return;
4 i K# h8 z! Y if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)+ _' W+ J- o. u3 h" D: [& X
return;
5 C, X( S( a: x! L3 D3 k2 M) t7 g3 q1 R
if (isset($_POST['notice_title'])) {7 _' p- n0 o8 f7 H- \5 `1 v
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));) q* O9 v6 B* d4 S
}
* Q% ~' X1 A+ e+ u. r0 @( }; o7 O if (isset($_POST['notice_content'])) {
% ~( j% D5 L/ ]- r update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
4 b) u" S# Q; q2 k/ y }9 ^& t& B1 g" Z! I
}
' V7 J2 K3 e! q! A1 z; B- @) ` ```2 t+ z/ G8 d7 Y0 j p
/ G, k6 @- R7 x: c( Q" w5 T+ b
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
2 M! q/ |' M& D9 M. y# n) h" l
& p) ^! S8 g- h: N3 N4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
; j6 n. V0 w# P$ \8 N3 I+ ]
3 L, @5 D5 v' j O; ^, H. L; M: l ```
U L( ^* S/ L $args = array(& Q) K' W$ ^0 G( }9 i+ F+ `" J
'post_type' => 'site-wide-notices',( q9 ~5 |- Y) i: t5 r8 O, Z
'posts_per_page' => 3,' ?4 S, X$ j( r& l6 j, e) l
'order' => 'DESC',
/ A/ t% v6 O: J1 [4 |! c; P5 y* u. C 'orderby' => 'date'6 ^- B4 A; M3 h( F2 j% Y9 @* ~" z
);4 f" J8 s$ ]$ K' g
$query = new WP_Query($args);
+ I4 D5 [& W* ~ q0 ] M& X* h. f if ($query->have_posts()) :8 j- ?, B2 Y$ o! W
while ($query->have_posts()) : $query->the_post(); ?>
3 \, o8 N+ F$ \/ o( L2 o <div class="notice">
6 R6 ^, x Z. c7 p" u" G/ B <h3><?php the_title(); ?></h3>
. {. G5 X: }+ C! U <div class="notice-content"><?php the_content(); ?></div>
4 I: e/ N) M3 K! n1 m </div>
, N( U8 a% X2 C% d9 |" d, h <?php endwhile;8 y7 x9 b. l5 o! S; t8 S
wp_reset_postdata();
' ~0 I+ Q7 V( R/ v" b) `4 i endif;) A! O' |( M, n b" L
```
' @' T: v& g7 X( r
9 f3 i' e# m J* j ] 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|