|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?% ~6 ^* m1 |; k+ F) b* ? L% S
" y: H! Y) s {, J8 K3 H* V; t; S
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
# y# P* W2 y5 k l! W4 h p+ u& k) H# X" V+ a1 C2 f
以下是创建自定义插件的步骤:
; i& r2 V0 _* a. ?1 S1 N% m8 I+ h0 }) |1 ~: `" h& d7 b
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:3 F( Z) ?2 i: ^- I: Z
, } {0 v* h! @5 P7 J ```
u) z( d0 _5 I3 ]: c: Y <?php
/ [* U$ w$ R- a7 \. ^, N4 H! F8 S /*
; U3 `: B& A& P9 I2 e Plugin Name: Site Wide Notices Plugin
& x% O( H7 G% j: N% {2 v Description: Adds a new custom post type for site-wide notices.- K, p6 j; ~# J' @7 a& Q7 o
Version: 1.0
; [8 Z6 E, z8 {0 z' _5 R Author: Your Name% ^- H) i Z/ g% L
Author URI: http://example.com
& ~! @5 y! r9 x$ e */
" Z( h( K, o- l9 ]$ h9 S
. J* }) K& D8 f/ C1 y" | // Add plugin code here...
3 I9 K7 p$ n4 [# I ```8 Q8 I8 k9 ? e3 M( P
9 b) z# s( v- K8 S ~. u) M
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。; O# Y% ?% f; g- v6 o
: A% _! I z; G) V2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:2 d0 |. m6 W+ M# U4 M l P4 S
7 X% W e& [" _
```
" M' a2 |9 y- m$ G4 i |( `& q add_action('init', 'create_custom_post_type');
! \# P4 e4 i8 K& l% J g. P5 Z6 s function create_custom_post_type() {
g0 p' C- F2 K0 u' @% o! A: u) j $labels = array(6 [. q- g z. p& D8 J, K
'name' => 'Site Wide Notices',
/ V' a: n6 X- s" [$ f) Y. N 'singular_name' => 'Site Wide Notice',
8 n2 n$ m) l( V/ v- A* |8 @ 'add_new' => 'Add New',# J/ R5 @' |7 l$ C4 y
'add_new_item' => 'Add New Site Wide Notice',5 ]9 @" S) X K4 F
'edit_item' => 'Edit Site Wide Notice',4 M$ S' [0 a0 S& e
'new_item' => 'New Site Wide Notice',
. M, `& T* e. V4 o( i 'view_item' => 'View Site Wide Notice',# F( X; I( v7 W% ~( Z1 R
'search_items' => 'Search Site Wide Notices',7 s( E. E! n& F7 I2 q0 z8 q; k
'not_found' => 'No site-wide notices found',- s$ E; Q/ L: L0 P% ]: ^" f2 A$ [( A& v
'not_found_in_trash' => 'No site-wide notices found in trash'
( J( e/ {% c0 ]( h );4 C, m8 R9 {7 N0 p! _
6 f6 O4 d7 [ ?6 s& h
$args = array(; @4 F# ~3 f. }% @" y8 c& u! d
'labels' => $labels,2 b5 ^) k* H" l% P+ P# L; i
'public' => true,9 ?* O. R9 u& N v5 M" O
'has_archive' => true,
$ z5 z8 }. l8 U- ] 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),# [5 D( v& c3 j$ G
'taxonomies' => array('category', 'post_tag'),2 Z/ S8 [' r, s! _
'menu_icon' => 'dashicons-megaphone',
3 a" [ t! i/ |. ^$ ?$ @+ r4 ] 'menu_position' => 5,
! r4 \, @7 e: b# K5 ]- D 'rewrite' => array('slug' => 'site-wide-notices')! E; D0 R9 c4 Q; t( u6 i
);
2 z9 @0 m2 \1 k2 n8 E
E) C R, s: {4 h7 q register_post_type('site-wide-notices', $args);
$ A w. {! M$ \. f0 A$ \ }
6 t; E% D& g" s- c ```: p! i) S: g9 C9 {. X
& f/ L/ t$ }' v
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。3 N3 H1 `* D8 u, P
/ H/ F( S9 @6 G% ? m/ t5 V
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:4 l( W, q$ y& f3 f
% x6 f$ p6 j1 d' E; Z
```1 e. F. n/ r/ B5 W* G' e* q
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
) c, ^0 Y5 f3 Y8 Q; v j, e5 y function add_site_wide_notices_boxes() {
7 t* t3 P" p8 X0 @* P# c# L add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');/ ] V: c# ^ g
}
) _* W! e( L9 \4 {
) `% C$ y" ^. T9 d4 q( w# I function notice_details_meta_box($post) {9 L* k4 \: N1 h2 j
wp_nonce_field(basename(__FILE__), 'notices_nonce');
0 c! e: R: p! Z7 | $notice_title = get_post_meta($post->ID, 'notice_title', true);8 C) ~! C" C; W2 m
$notice_content = get_post_meta($post->ID, 'notice_content', true);
( l5 G8 F: Q% L' O$ O% j ?>/ s- W" P2 ?" }* K( z
<p>
2 _( ]+ E7 ~1 E! O3 N6 f3 ~$ u <label for="notice-title">Notice Title</label><br>; \" _0 A( L W3 E
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"> ^3 I6 w* e8 n9 s. X- y) M
</p>
: w" w3 H0 o' i& z# G <p>
3 B% X( E7 \- k( e <label for="notice-content">Notice Content</label><br>+ c& I+ l0 K/ q' B. k" n
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
( }! N8 I' }8 ?; C) }) ?; A$ j </p># [( ?! T p% C5 R& H4 p9 G
<?php
; I9 z4 P" `' y) Q- ^, s. G }* Q. @; \$ h1 v! i# F. t, D* r) B
B' p: O; e+ O: c) {) p8 _ add_action('save_post', 'save_site_wide_notice_meta_box');
% @( o% X( @$ c, v7 A0 ] function save_site_wide_notice_meta_box($post_id) {. Y* x" L$ Q, w3 ^; i4 }5 W
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))9 t$ z+ X8 u( \: g/ g/ n2 c! |" V
return;1 c2 K5 p! h+ z( A
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
& {4 l/ U. l0 g0 O, {( Q return;' N# r3 ^0 L2 _. F
8 _. j- @' P8 ?" i# m4 X T5 [
if (isset($_POST['notice_title'])) {* W1 b7 b% r I: t1 J
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));# W8 j q$ l+ g( F$ O
}3 V: v+ [+ z! m3 I, \: F" G' k
if (isset($_POST['notice_content'])) { S( C0 F4 h% W4 w0 N8 U! K! ~
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content'])); b. a8 a# F- ~! ?: b; R- `- _
}
0 I# @! y; X' B* c1 g }& o/ x6 e9 A9 H
```. [) A: c" F: {* A7 D
H- y" s. d/ f, q" @: p 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
3 @9 f: Z$ h7 X! M" z9 X4 K- g, |" F0 p; I; I/ ^$ y9 h
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
3 v& [, I# I+ Q0 {' e) R9 J$ d4 R
```
+ L8 D) y( n5 C( }: h3 J$ \ $args = array(
' ^: O& q% ~: X8 w8 w$ g 'post_type' => 'site-wide-notices',/ r: y ]2 q5 r; O6 ?( j
'posts_per_page' => 3,5 _6 o' ?( k2 v- A& Z2 j, G
'order' => 'DESC',
! j' H* J2 |- } 'orderby' => 'date'5 m6 {5 |# j+ H* W1 H; e' O" Z
);
4 i4 a- [% @ I' _4 @ $query = new WP_Query($args);
; R3 g% J6 ], \* S, I' u if ($query->have_posts()) :( b% G6 ^8 q- u& f% H: c
while ($query->have_posts()) : $query->the_post(); ?>
* y; v; i% K8 |0 l6 q# ^5 Z$ ? <div class="notice">' b# v8 t" W: d1 {3 j
<h3><?php the_title(); ?></h3>; O. m: C4 N" _& l
<div class="notice-content"><?php the_content(); ?></div>4 Z. l2 \' |4 {7 f$ @9 u) s7 e7 ^1 |
</div>! U! k8 _5 t9 U5 A7 X
<?php endwhile;. Q/ H4 A- Y" K3 \ ?, Y
wp_reset_postdata();# x/ j5 f7 }2 J6 ^" L
endif;
- w' A3 c6 b+ p0 { y ```) c& \; M8 s7 `* }5 b/ D
6 x/ G% p/ a- g" H: N
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|