|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?$ s$ J: w8 j- A: ?7 D0 y# ^& u
, t# T# o2 _! S" J
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
+ a- p3 C" w' g6 o0 I
5 ~ \/ U* y! M; j& h$ e以下是创建自定义插件的步骤:4 e4 i( \1 Y( p, Y) p
! s2 p O3 ~( Y3 u9 ^7 v' n* Q
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:0 y4 v! I2 g, I0 w# v
6 u# G1 m. f# G7 l+ I2 z
```
) m. r/ t5 D4 f' y8 ? <?php
- V* m# v0 q+ x2 @. J! F /*: W% U) w7 Y4 u) q4 Z
Plugin Name: Site Wide Notices Plugin
; A% y% Y0 F& W1 ^8 t2 n2 n Description: Adds a new custom post type for site-wide notices.4 t5 t: T/ F# _7 {. ^ E
Version: 1.0* ?7 t+ A) r. Q4 j" {, P/ A
Author: Your Name' U6 p/ ]- P$ |! m
Author URI: http://example.com
' G: G8 K+ i! j6 i( H) U. m */6 l8 z Y: |4 p; V) |: y9 i
- A5 R( E' Q; t* q& J4 o7 W // Add plugin code here...
0 y! l6 O( d+ a' q- B- f ```1 u# @$ |" p* F4 Q5 k5 n' J* E+ L
7 `: X4 Z( b7 S& I4 [2 m
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
, _8 ]5 I8 `6 A. h ~- ?+ F
V5 o. y: N ]4 i2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
6 Y6 G c8 U9 e2 M) K; M2 A3 R' Y0 A8 P2 Y
```/ c$ R% X+ T7 R8 I
add_action('init', 'create_custom_post_type');
m! C8 o' M! g# L) V, M2 w function create_custom_post_type() {/ y5 @" q+ M9 d1 x0 _, ~6 ^- G
$labels = array(
3 ]2 |" A: N8 A. K/ @+ b# E" M& { 'name' => 'Site Wide Notices',
0 w1 _1 X+ [7 d( _+ e! K# E 'singular_name' => 'Site Wide Notice',
Z3 q2 p& u2 S1 ^( t: h" ] 'add_new' => 'Add New',
: X, E% ^- `3 w0 Z* H 'add_new_item' => 'Add New Site Wide Notice',+ s A1 m$ x2 h
'edit_item' => 'Edit Site Wide Notice',
: a8 Y" M4 V+ d/ W) Q3 G# {( }- q 'new_item' => 'New Site Wide Notice',
5 t. v8 ]2 S1 c 'view_item' => 'View Site Wide Notice',
) J9 c9 N3 E A 'search_items' => 'Search Site Wide Notices',
: q6 }3 k) E% N3 @ }3 w 'not_found' => 'No site-wide notices found',
j& A/ k6 l/ ` 'not_found_in_trash' => 'No site-wide notices found in trash'0 m1 b+ K* X8 L4 b& u
);
2 }9 P3 ~8 G, G* V4 w* h; z& M+ C9 }7 |! `/ f) f5 u3 w
$args = array(% A6 D$ i$ e. ?& d' Y! |+ a
'labels' => $labels,
6 v& y0 p9 g# S" h 'public' => true,
: s h% g7 o) X0 v3 l7 u 'has_archive' => true,
! h' s, ?3 x9 ?6 B: A 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),- w) i& b4 N6 ^+ L! v6 C/ w
'taxonomies' => array('category', 'post_tag'),5 ~0 y1 h; m8 D9 B* i
'menu_icon' => 'dashicons-megaphone',
2 n$ k. k) C/ j 'menu_position' => 5,! l; V; z$ P% f) c. K
'rewrite' => array('slug' => 'site-wide-notices')
6 P) {" n% ^) k+ y) f );, g M5 Q7 p1 U0 F( F% g
/ l D# |3 D7 z. r; M( p
register_post_type('site-wide-notices', $args);' r, s( f# d. L* N# i' _* u4 \
}
% N T4 E8 y" n2 B0 K4 L: }) b; m ```
6 m8 V" ]0 r4 y: o! S8 M$ s- G# R4 s# L7 S, w
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。: T5 t, E* ^4 q& `& o& K9 @' ]% x4 I
" Z8 n0 T _6 S* w3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:6 m& K: D* g" M: ]. |
. J8 e/ \0 F ^
```1 ~. b# a6 o. r; e$ u
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
3 ~. s/ K l7 i; Q* q& X8 g! f2 \ function add_site_wide_notices_boxes() {' T: F+ s4 A* v$ B: [ l9 ^& V
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
" { q* A6 X: Q% ~2 d& @6 b! F+ G }
8 I0 g1 f# H( s9 Z
. E$ b& T( v. O/ w function notice_details_meta_box($post) {
8 u& b, l- _: K1 b2 f5 d wp_nonce_field(basename(__FILE__), 'notices_nonce');" d- ?/ R; f- g R4 E
$notice_title = get_post_meta($post->ID, 'notice_title', true);
4 A. h( u) X+ T $notice_content = get_post_meta($post->ID, 'notice_content', true);4 v! M7 I R0 H- h$ {
?>
$ S+ X* C* _& V, f z <p>
8 K" v J8 ]6 h+ w <label for="notice-title">Notice Title</label><br>2 x* ?$ @, [5 g7 r
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
3 t' b) C2 _( [; r; I' L </p>" O1 a7 W1 c# }; {. _* n
<p>
6 L! s" W. b- g5 E7 j" c <label for="notice-content">Notice Content</label><br>7 S) b1 d" d6 Z$ e) p
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>* i" t# C* C" g) ^ v) y
</p>
, x( e+ V; b/ R <?php
1 a, Y* G, u* ~& v4 v; p }" L4 r& U7 r: }' Q2 x8 i9 \( h
: N4 C0 s m! l# t) }& r add_action('save_post', 'save_site_wide_notice_meta_box');" b' L$ s2 p% _% ~( I* v& \( }: p
function save_site_wide_notice_meta_box($post_id) {& z! K1 z* E2 I9 U- w4 Y
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
* p1 i6 I F+ J% Y4 b! Y0 { return;
. P+ O; V1 R' j1 Y& c4 |$ o! Y if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
4 h, ] N. }7 @2 J5 R R+ a return;
* p. ~7 r A& x- p+ \
) Z; R8 D5 {' F( B# r Q if (isset($_POST['notice_title'])) {
4 f+ A/ y6 R1 G8 \ update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
& a$ j$ p2 \; W } S# W$ }, X& {, b8 M
if (isset($_POST['notice_content'])) {
5 g, m& j3 |" p; l) \* l0 A update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));+ i1 ], h. t3 B& O, C3 S1 M( q
}* E& [5 p# t2 e$ C5 q4 P
}
( F7 _$ B/ `5 t6 H, _4 {: L; t ```4 {- m2 x; D5 ^) d
# P" B* z5 V& I" E3 z
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。+ b& }7 P& M, _( h) T J, Z
7 ~ S: I% Z, g! m$ c) r! x
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:# }5 ?( V1 t( S+ J" W% j9 j, g$ `6 ` n
- _! ^- D! M$ }( F1 s: V2 m ```
5 u- B [. G) g' c; n $args = array(3 G( G0 W# S/ X+ _: x
'post_type' => 'site-wide-notices',, a/ c9 p) W0 ]/ n2 p
'posts_per_page' => 3,& Q q. g6 L4 M( r
'order' => 'DESC', B+ O4 g, e9 I3 E' {
'orderby' => 'date'9 y" e7 T$ Y! m& v+ Y% H* _% d
);
0 e5 F+ X& Z1 X. D9 S $query = new WP_Query($args);
0 p9 X, [7 \ d" j if ($query->have_posts()) :( @2 S- m3 l* {6 i+ ~
while ($query->have_posts()) : $query->the_post(); ?>
; z5 d0 W$ v3 ^# o( a9 ? <div class="notice">
' Y' t* @% j" J) Y* ]: m6 p3 p <h3><?php the_title(); ?></h3>5 K! i1 M$ O) {. A' z
<div class="notice-content"><?php the_content(); ?></div>
$ N1 A+ `! ?. Z- V$ \1 _- _, M" } </div>' B, ^" h$ E. t/ L
<?php endwhile;
- A- y5 ^) I4 E. G wp_reset_postdata();1 S( v( C2 G7 |, O0 M
endif;
/ j0 Q3 b+ {( m8 u% h* A. T ```
$ n" q. v/ i, S+ W$ @$ k4 s6 F& ?( y4 h8 I8 ]
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|