|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
/ ?& ?6 @( J2 w* l3 d. Q" q f8 F/ T
L+ k A, |+ U8 [9 f2 n如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
0 I, E8 Z% n% W$ H. H4 Z1 @% N- h% v0 P' [, _- m
以下是创建自定义插件的步骤:% J0 N4 a/ x+ \0 R' ~$ I5 Y& M! L3 P
" y' b1 g1 J: `; h7 _- [# h# g; }4 `1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
" X5 R* I- z* f' r- x
. x$ r" _& g, \# V( r2 J5 T2 t ```
" i( a) e( q' S6 @6 T <?php; W( |6 q5 C1 }3 V9 ?
/*# R: {+ H6 e. C& O- l, {
Plugin Name: Site Wide Notices Plugin
[" Z# B1 j: z Description: Adds a new custom post type for site-wide notices.6 H$ S: H. [4 J
Version: 1.0
/ `; H+ b$ h+ }4 ] r9 G Author: Your Name
1 A/ c2 u8 c3 z) j/ w h0 A2 C Author URI: http://example.com6 g1 n& C, L; `" X8 r& }
*/
9 y. P; q2 j& H- Q9 O' P ?4 x# U1 u1 F" O" c1 }
// Add plugin code here...! G) [* H- n# Z3 Y0 B
```
_# }3 x/ M7 k) `& S, p$ z# Z% `, x, R; y% L' ^; d$ }1 K
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
% s+ ^0 f/ ~8 _ [" s6 {! l& B
7 F' D0 D" P1 M; E- {% K2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:3 T5 ?. g+ c/ F. E ]. R* Y/ c/ L
, s- Z* e; h) y7 ^5 | ```
/ h X4 V5 b0 g5 d add_action('init', 'create_custom_post_type');- e- d3 J0 n, e$ A
function create_custom_post_type() {
( e. O: t+ ]8 k8 i& D, B/ | $labels = array(1 ^$ C8 k m3 V2 h
'name' => 'Site Wide Notices',
) o7 Q) ]* T/ w2 q* q. u* Z 'singular_name' => 'Site Wide Notice',
0 r* t* C3 H3 ~* D8 @, ?! O) U 'add_new' => 'Add New',0 T- A& X0 @# y0 p! s; A
'add_new_item' => 'Add New Site Wide Notice',
$ H2 ]9 \9 F x& Y 'edit_item' => 'Edit Site Wide Notice',
. t5 d. z6 s9 ?' q/ h- ] 'new_item' => 'New Site Wide Notice',
& b B9 A/ m# z$ k3 f 'view_item' => 'View Site Wide Notice',
3 E: [4 F6 l; H/ w& E* r; ?' c j( r' a 'search_items' => 'Search Site Wide Notices',
. I5 u9 P% q ?6 @ 'not_found' => 'No site-wide notices found',! [6 _: f0 c8 e5 g
'not_found_in_trash' => 'No site-wide notices found in trash'8 v" s( E5 p& D
);5 d' p+ r1 w& `% J$ C
) M, s5 ?, R" M8 B7 x9 D $args = array(
0 C& O0 I( Q+ p) O7 s; N0 k0 F 'labels' => $labels,3 d/ ~: }# s( {6 N9 u
'public' => true,2 s2 Z. L z$ E5 X5 ]" L( ]2 F
'has_archive' => true,
* y4 x' F r) |* S/ ~8 ] 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),9 K V6 K' _/ V+ {
'taxonomies' => array('category', 'post_tag'),
# X7 ]+ e, [: q5 _2 {3 Q4 p 'menu_icon' => 'dashicons-megaphone',
# F, }, W3 h7 x 'menu_position' => 5,+ ]- H- _( L( M
'rewrite' => array('slug' => 'site-wide-notices')9 Y1 s( \- q6 w; s
);* [- r( k" ` A
9 V9 Y* E0 @2 a# G# D2 m. K4 x
register_post_type('site-wide-notices', $args);( s( ~) ]' B _# G' ~6 B% X5 [% y0 i
}! h2 l# g2 P+ E# n9 X
```
2 x1 B1 U6 }7 _( ?; c6 J- s/ y. w1 X) e7 x3 a( t; t$ @
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。& t) L) H, N/ L6 l: u
: j( z' k3 i4 H$ U; j6 `% u3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
K" e/ b4 j+ _0 U& B: }+ v: w, j% z4 R2 d* P3 m$ w: O! B0 O7 Z. t
```+ t1 T! W$ a- ]! Z3 s
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
`; F; h' g# g& P: C& e* K1 c function add_site_wide_notices_boxes() {
$ { V, G( F, A8 l5 _! I$ Y add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
# j! r s8 `* `" U6 D5 a, z; d- @- | }
& }" z3 Q' h: V$ `$ M
2 ]( a! l. v) r; T+ L function notice_details_meta_box($post) {
. }$ R% A+ @1 B! _0 D wp_nonce_field(basename(__FILE__), 'notices_nonce');: V5 ?5 {8 w. o: m4 H
$notice_title = get_post_meta($post->ID, 'notice_title', true);; k8 s# V5 a) W: |7 S
$notice_content = get_post_meta($post->ID, 'notice_content', true);4 x! P6 t) {/ y& c1 U3 U9 v
?>* D( I% G9 J2 S0 V" E
<p>+ v2 d% r% j$ _: {- a g: x. w
<label for="notice-title">Notice Title</label><br>+ h4 m" j0 d+ D0 K
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
/ X' z: x) K5 f/ ], X. U6 ] </p>( Q# T0 ?8 p* l' X) F) p. }0 E
<p>
4 o2 ]3 {" H {) R3 o6 i: L; E <label for="notice-content">Notice Content</label><br>
# l1 i7 `0 ?9 c0 ^ H+ P M <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>- n# ^, ?6 ?% }5 z) L, _
</p>
, n2 P# h( h/ E; m$ L3 ` <?php
, `# d7 y5 p' ~6 \$ e4 Y8 {3 r }0 m/ ^' j+ [: _9 `5 H
5 Z: n/ Y. D4 d8 z
add_action('save_post', 'save_site_wide_notice_meta_box');
9 ]6 S3 X5 s) n4 r function save_site_wide_notice_meta_box($post_id) {
' x3 d7 O0 Y& r }- k if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
( r n, o9 R) w" s+ j return;
1 N) R0 h: D9 O1 t# l9 M& I if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)* f$ n$ z. B b" n3 |0 P2 ?; h
return;8 @" V% ]) M" T% l1 _8 u
( q( C& H' l% o/ V& ~
if (isset($_POST['notice_title'])) {" \8 W5 z% N% W3 k% r; x$ Q3 i- [) G
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));* i# @8 ?& g" E
}
- s$ j+ o* K3 R) d if (isset($_POST['notice_content'])) {& C% S. s2 G, l# ]8 D( u9 p
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
1 `. M$ n* \4 c }
; e# V4 I' v, M' z" a5 Z }
$ \1 ?3 ?6 i X6 n @3 g ```
( ~; D3 g; o: R+ H% v
/ C5 f, {$ f2 k8 e+ Z8 { a 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
/ T/ R# _5 z W: f" M
2 `6 b. ~9 ^ X# G8 i2 k; D4 m5 S4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:, C" M! p2 v' T) L2 u! Z
: m0 W% r: t" y" V- P& \
```8 l3 g/ L7 Q! b/ u0 F
$args = array(7 Y6 f2 R3 h y
'post_type' => 'site-wide-notices',
7 H, A* V5 e$ {9 T8 e 'posts_per_page' => 3,
/ a. r8 a: G9 a5 l2 ]9 X 'order' => 'DESC',5 q6 W$ ^" ^0 C% @
'orderby' => 'date'
5 \1 B7 b Z/ g7 Z );
6 @9 i8 i* h* U# c2 {2 r $query = new WP_Query($args);
5 x5 y( I% `7 M: w2 P if ($query->have_posts()) :4 n6 p% f* Y, ] f' d" @# j; K2 r
while ($query->have_posts()) : $query->the_post(); ?>" r' E, O" ?. l
<div class="notice">, ^4 F8 x* r8 L# G
<h3><?php the_title(); ?></h3>3 o$ x% H8 X: S+ m
<div class="notice-content"><?php the_content(); ?></div>6 @7 o1 h1 e+ B1 K* a5 N
</div>
+ b! @ `5 i$ e4 x$ e2 ~/ t$ T& M <?php endwhile;* C! I1 ?1 ^# Y
wp_reset_postdata();: B2 i. C7 i2 a9 p4 N; N p
endif;
$ ~7 Q: F) Q6 A" y ```, `9 m. M' `# [8 X" O
( ]& D/ w6 [2 q: @ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|