|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
' f0 g0 O7 M: r
# W7 v4 b6 h9 }+ v1 e如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。4 r, U& K9 E; }/ H- V5 d2 c. s, C
3 J( |: Y9 z9 {) t/ C# @
以下是创建自定义插件的步骤:1 M1 S8 e( {0 Q, M
2 b3 `% H8 q- ]' l7 X/ @3 k- J5 M
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
/ r& Q# j4 |: h' ^% x! _3 V4 [6 g( \$ ~8 Y
```
! f8 A' G& B( G <?php
6 B5 p0 P. M0 u; U /*- `* u- t# ?& s* {3 J
Plugin Name: Site Wide Notices Plugin$ G: B% S; z9 {
Description: Adds a new custom post type for site-wide notices.
( m) Y! ]5 Z2 a) h1 g$ T Version: 1.0) }' t# Y5 P% N' D7 O' `# \
Author: Your Name* x4 s$ Q4 O1 p' n' |% Q/ r, i9 D
Author URI: http://example.com8 s' ^- U: p4 I" |6 Y' G/ ^0 b
*/
6 q( q7 a7 K, R/ T% W+ ^$ x/ w. r4 I( s: L
// Add plugin code here...
$ v+ p9 y x" |+ T" k' B& D ```
# @* a, y: M. I
: z9 I2 U+ p/ p- J$ d/ H% a- L; d 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。4 m/ p7 u8 g2 n# G W
/ o6 } C* ^4 f) V2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
7 A; o3 q- K; |( B: g) `# t& r7 y. }6 F$ {& G! b0 S6 M t
```
. A3 Q- m2 l* O4 D6 |! m add_action('init', 'create_custom_post_type');2 U* E/ T( ]) _/ ~1 g: N1 `* N
function create_custom_post_type() {
5 y3 q% O* A$ x5 k9 Q $labels = array(
3 w3 w: A3 Q; F0 } 'name' => 'Site Wide Notices',
4 H2 P/ L* Q- @, S6 V 'singular_name' => 'Site Wide Notice',& @; c) p( @5 }
'add_new' => 'Add New',( v+ Y" n0 W3 X
'add_new_item' => 'Add New Site Wide Notice',
# b3 S V+ ^) S* R: i1 Y 'edit_item' => 'Edit Site Wide Notice',
( }0 m! r8 D& l: F1 W) T 'new_item' => 'New Site Wide Notice',) Q4 l3 n: F: v+ r8 u+ X8 F
'view_item' => 'View Site Wide Notice',/ ]/ s N, S& Y0 E- e
'search_items' => 'Search Site Wide Notices',$ O9 i) \& |( L" p) F9 v# u. f0 |
'not_found' => 'No site-wide notices found',/ a5 _% H k+ ~5 ^; w
'not_found_in_trash' => 'No site-wide notices found in trash'" d/ R% y+ m# C7 c
);
# a4 I, x2 h% X% B/ o5 P7 O
. x/ j( B/ n% D3 O $args = array(
4 u* V- ^8 D" I# E! h 'labels' => $labels,
& Y0 c; t2 f1 O# \/ R% r 'public' => true,
. n2 u( f* g6 D N' P( a1 D" c; P 'has_archive' => true,
# D, i. S: |( K: t5 T 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),/ i$ y" S$ J* Y4 y
'taxonomies' => array('category', 'post_tag'),) C: | o2 A+ y: k
'menu_icon' => 'dashicons-megaphone',
4 l4 @0 s0 q2 z. F9 e+ Z$ A 'menu_position' => 5,( L' k0 |' C1 i2 N4 @3 {# w# u
'rewrite' => array('slug' => 'site-wide-notices')8 N& [ ]- i* ]2 @- e9 E! i% o, x
);
7 l& T* b& d6 q2 v9 S2 ]
5 ? d( e' ~ t5 P) P n; T register_post_type('site-wide-notices', $args);
" M! T% j1 ?& g2 j9 v) b6 ? }0 g# M% f9 S9 l
```
# f2 H, U+ e2 V
/ E) R% f8 g' p3 @- x# M; X 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。. X5 o' Y% J8 L2 I% y
: T6 a$ \9 ?. J: c. T/ L5 f
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
2 d/ Q& M2 l$ l) j/ l: T* K7 O1 E8 e, N" q" A2 v' u4 @
```
; n: C+ t& K$ b! ?: V add_action('add_meta_boxes', 'add_site_wide_notices_boxes');3 w* q" M4 v5 ~: P
function add_site_wide_notices_boxes() {
2 S, r2 I, s! L; M/ n" f1 l! H add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');/ ]9 S- n* D. U& C9 [# Q
}7 `0 Z( U7 o& k2 F3 P$ Q" R
; R$ V0 p. J( D; H" [
function notice_details_meta_box($post) {
+ K# a0 w8 K: G. w- p0 S, w wp_nonce_field(basename(__FILE__), 'notices_nonce');, l7 t, H- g8 N0 v$ g, _
$notice_title = get_post_meta($post->ID, 'notice_title', true);2 b/ d: e% F6 q' `9 K
$notice_content = get_post_meta($post->ID, 'notice_content', true);$ S* ?: } Q3 |0 \ U. o0 p; N
?>
+ l6 Z: G: S4 K$ M) @ <p>
+ Y* X0 W5 k0 Y <label for="notice-title">Notice Title</label><br>
6 D/ d$ p( j& `1 ]0 \# L <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
3 i3 F3 A: c: o4 N, r# o- w </p>
# u* `7 A+ F8 f) g. `& }1 l9 a <p>) `# S3 J0 T3 I% S: d$ |
<label for="notice-content">Notice Content</label><br>/ L8 w8 }6 n1 V- K0 `
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>: ]( s& E# j6 f1 O! S' `
</p>
( i ?+ ^' [4 t- Q <?php
* z4 v7 W. s6 {* w. ?0 M5 @2 B( p }. j0 B' v% y4 t
* x/ X$ E. f( P
add_action('save_post', 'save_site_wide_notice_meta_box');
: F" I) O5 [/ ~) `+ q8 n) F7 w- v# W function save_site_wide_notice_meta_box($post_id) {
) t' c% d: c! a% f* v# p% u if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))" |8 @* o8 G* q5 D# F3 v
return;6 ]5 x+ ^3 |# ]! m. c! Z
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
N+ b8 P2 H5 }5 x9 l return;
. N3 k; }( y1 E5 K, q9 B( R: p8 t
( t, S0 j7 r' V1 ? if (isset($_POST['notice_title'])) {
?; s' Y. r% _ update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));# ?5 i; Z7 p# v5 ~5 U+ ~. B2 i: L
}' A7 H( ?; f& S, [/ Q
if (isset($_POST['notice_content'])) {
) Q0 M2 y |: v! c- P# L5 y( Z" s update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));7 w- R, o7 X9 O9 U2 H) ?9 c
}* J; w2 i! n, H8 Z* X" M+ Y0 [1 [* M
}
) u( M, q3 G T, `. S ```
2 I9 p& a! s1 t7 g u4 _
2 {) _6 Y% m) \. M4 G+ a 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
* ]& R8 V& u& I2 {3 h" }
/ ?0 t, Q2 J' E& c4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告: m( o4 P" o m6 h
' i/ B% X% f8 z# r6 Y! k3 R3 v ```
6 W6 m# D' J7 Y! K* {$ v $args = array(
- w6 ]: t0 Z# y$ | 'post_type' => 'site-wide-notices',+ P# E& w5 e" O& S* B
'posts_per_page' => 3,- M+ G9 O# C8 f
'order' => 'DESC',
- C$ @6 Z1 Z4 M, }. i 'orderby' => 'date'! W0 a/ _2 r: [7 V7 }
);
# v: ^* v; ]5 c2 V$ c3 N $query = new WP_Query($args);
1 n% j G% j' M! C if ($query->have_posts()) :/ h5 f7 H. y3 X6 }4 S# a4 c- e, W: W
while ($query->have_posts()) : $query->the_post(); ?>, T# e& t6 ]- R
<div class="notice"># Z. P1 ^$ G' U+ W" j
<h3><?php the_title(); ?></h3>0 y! Y( u/ h- N* S3 D3 x
<div class="notice-content"><?php the_content(); ?></div>
) t: B& Z9 q; q) B+ y- V/ X </div>7 Y& T" u# n+ } R4 T. y6 o
<?php endwhile;
- F, U% N9 G6 y& z8 Y wp_reset_postdata();! L1 r/ \# y! ~# H: w$ Y
endif;$ [* ~3 X+ j6 f& z7 W; K2 u
```( h4 B$ g( w9 |# K3 A, w
5 o( Z. X t3 P0 W" M; Z
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|