|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
3 s2 ?9 g0 x7 X3 r( Q: q4 ^' l5 \: V- E! z% [* |. O0 `# V
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。+ p, F5 F- O% p* Z% q b
H3 A J* C/ @) `( R7 H7 o+ Q9 b$ H
以下是创建自定义插件的步骤:
1 t% L8 Y/ u, ]$ M9 d. J7 {5 K$ H1 w
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
3 j) @9 h- A9 Z% c
" b# r/ P' i( w2 C5 w e ```9 Y0 B; M* Q: t B U7 A
<?php3 l8 ~# t* x6 H- [" u* S5 v# k
/*" n& c% q1 P8 S
Plugin Name: Site Wide Notices Plugin* z7 B V0 L6 S2 s8 l2 L' }* q
Description: Adds a new custom post type for site-wide notices.
) T# j# k/ Q5 i) N) }, o% F Version: 1.01 m. a( b; \. o" \ C& {2 B
Author: Your Name
7 D9 f! a6 B8 K+ O Author URI: http://example.com) W3 k( \0 w/ `- d+ e
*/6 O- K; l/ J$ X% O- W3 L9 v
% P' a+ M6 L/ d* c E // Add plugin code here...
( F; q- k5 x6 r% ]% w! C2 u ```
1 ?0 G+ u8 G' y* ^3 Z$ R6 ^) i( p+ {( A6 I9 r# O: V3 K
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。8 O' P2 ^2 G7 C# ]. C0 Q
% @+ _. X3 |, d- `
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
; j- w+ E9 g) G+ o$ h* r- t4 B ~3 k: O- z% G' s5 G
```
( j0 {' T! ]) h add_action('init', 'create_custom_post_type');
& \, k+ ` E. R* s* v4 z: r function create_custom_post_type() {9 t/ E2 d' E/ {7 Q
$labels = array(
0 O6 q* K* x; h( [( E2 M4 s( m8 [ 'name' => 'Site Wide Notices',' J. \' M5 |0 q2 ?% c
'singular_name' => 'Site Wide Notice',# G: Y8 }( {+ C
'add_new' => 'Add New',
N4 i( |2 n' r" S# G% N 'add_new_item' => 'Add New Site Wide Notice',- Z7 B/ h+ A0 u0 K, c- a1 u: U3 }
'edit_item' => 'Edit Site Wide Notice',! S2 ?: D# b0 f0 C F, `
'new_item' => 'New Site Wide Notice',9 d6 b$ {0 o' s* E/ L7 y0 Q% x- b
'view_item' => 'View Site Wide Notice',
1 o5 P* I" c* H0 { 'search_items' => 'Search Site Wide Notices',
& R; A# ^3 R. K) W5 X7 d1 f; \ 'not_found' => 'No site-wide notices found',6 Q5 U- G1 ?& F3 R
'not_found_in_trash' => 'No site-wide notices found in trash'8 A* \- ^* |3 _/ F, O( b
);
3 E' R% y( W7 l# `* F: E: R* B+ p' i9 j1 g H! z
$args = array(0 S4 |, i4 M1 M# i* {% p8 y
'labels' => $labels,5 u7 X% e4 u$ C. K$ Q
'public' => true,
4 i. q! P+ d/ X- V: i' R* V 'has_archive' => true,
! z8 Z% ~9 t3 \ 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),) o) u" f: b) G8 W3 r7 e x' w
'taxonomies' => array('category', 'post_tag'),/ m* G: _. U9 h3 F& r
'menu_icon' => 'dashicons-megaphone',
# s- e9 z- s0 t7 w0 n$ \ 'menu_position' => 5,
8 U! o! C. C' R) t/ X; H 'rewrite' => array('slug' => 'site-wide-notices')
; V, H$ @' G: V4 H3 @ );0 {0 r' A O" I: D$ o- S
6 v4 [) C3 h D3 ? register_post_type('site-wide-notices', $args);/ `& J' k* K6 l+ A$ j' K; n/ r
}
1 I G! m/ z5 a8 y5 R1 Q* Y ```: o! T; P3 F- F( U- s$ ]
3 S; o; f8 g. ?* f& \; f0 s
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。' G9 p8 K. \0 h/ R# [
- r5 o8 t0 k2 f6 |+ Y4 ?7 C
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
! @4 b+ a$ i' e4 K
p7 g" f& X8 T# l ~; z9 m ^: S ```
. R9 d% O4 C# c3 y" u- D add_action('add_meta_boxes', 'add_site_wide_notices_boxes');% O s! g7 J( ~4 A! _
function add_site_wide_notices_boxes() {
- r# O" D+ n2 K9 l! `, J4 d6 O P) u add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');+ M, N. @4 ?3 D2 n
}
2 K; S, Y. @0 _/ l3 ^3 G% y% v4 T& P% W- D: \6 }: |
function notice_details_meta_box($post) {+ a: \. H+ q- E# i
wp_nonce_field(basename(__FILE__), 'notices_nonce');! k5 w6 C# P4 M+ Y. S- K
$notice_title = get_post_meta($post->ID, 'notice_title', true);
# M8 s' b3 R& \ q $notice_content = get_post_meta($post->ID, 'notice_content', true);; f4 `6 O n) W7 u' T+ X4 }
?>
# g7 X' w2 g$ D4 f2 ~7 L, m7 w <p>
& |: I# m& L+ G/ V) q <label for="notice-title">Notice Title</label><br>
4 Z/ C6 v; ]* b* b) m9 u <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">% X( ^% D8 i- T# v' p, _8 j
</p>
@1 D& R; F/ e <p>: M2 R4 @5 L& a/ ]8 @' Q5 p; X
<label for="notice-content">Notice Content</label><br>
3 ?6 ` m }+ R- ] <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
2 @' j7 n( n/ [ ` </p># B9 j$ h" N' N4 o" d [' i+ x
<?php
2 J( o2 k* Y, J A9 @3 G) h: T }
0 |/ r8 a3 W* E$ u0 w2 V
' x* t* C% d; ?4 | add_action('save_post', 'save_site_wide_notice_meta_box');- J! T" Z! _0 \$ E
function save_site_wide_notice_meta_box($post_id) {0 J _2 N7 `2 H: c0 \9 d& @
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
' A1 U' b' B2 K; I) n return;
5 X( A2 r- y0 A: @1 c if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)8 ?- E* S" J8 N: P& Q, H; L
return;
* d- [8 d+ [. U$ z+ e2 n/ \' `4 x8 I* W: S1 S
if (isset($_POST['notice_title'])) {% m+ J) M& u ?# @" G
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));3 N& k. N p: X" A
}
7 r# C% s. x/ w9 j( q6 p if (isset($_POST['notice_content'])) {
! C( C7 b) t/ F! q# s, M0 j% j update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));" v0 V# A( X2 A; c5 R9 r
}
; a+ J$ {6 h$ O3 X4 o0 z( n }# p+ s/ L h$ `9 |
```+ j" x& ~/ `! {2 h* b$ Z V
* S5 n0 \9 \# M$ E" D% G2 A2 r
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。6 {0 R3 D2 ^/ \9 q
" ?0 ^/ X1 L2 _: e4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:4 Q3 f* l* j. `) h- F `
4 d# Z6 n4 h: K3 } ```
; c9 T, r+ l5 Z' ^$ ~/ ? $args = array(2 R# e$ k5 R" ^& H, v2 P: t1 B
'post_type' => 'site-wide-notices',
8 S2 I# n: e; z2 y( o" Q& s8 g" g 'posts_per_page' => 3,5 m' Q/ o3 G6 V* b5 t a
'order' => 'DESC',8 L; Y/ p# U8 K
'orderby' => 'date'# t" Q1 w# i: `' t0 ] p# @
);* @. i+ h+ x1 P- `8 ^' L
$query = new WP_Query($args);3 @/ v. g0 y$ r4 {( j- V) I
if ($query->have_posts()) :
9 _ I2 k) S# l& g2 i$ l while ($query->have_posts()) : $query->the_post(); ?>
% z D6 Z2 o$ e) n+ P4 o <div class="notice">
# t2 O/ B& y/ v6 O' `7 Y <h3><?php the_title(); ?></h3>8 \8 z s! h' z1 K4 V2 B% \
<div class="notice-content"><?php the_content(); ?></div>/ k3 g; K& _4 C8 s' A* i9 k
</div>
, h8 X6 q% a2 u9 u% P# O <?php endwhile;
! V" ?" V% D8 \4 E9 F3 }: m wp_reset_postdata();0 P7 T' I5 F5 X' R/ I4 c
endif;! D2 _3 [( m8 |
```& g; w( V& J6 S8 p. ~* @& p
4 M9 D7 e" o- ]5 r 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|