|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?0 K6 o3 A1 Q6 b* X( I# x- T) t
8 `2 w. N6 I3 m/ y# Z; f如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。/ a r6 ~# R, N6 |
, b* a6 ]& K7 _/ [5 |1 Z以下是创建自定义插件的步骤:
6 n' j1 v9 r- L
4 q6 i, L& ?, g& h6 H! \! V1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:8 V% ?/ \; |, [9 D
3 ?. d' L$ C' v+ T. z* c
```- e' N: F8 I2 \; V% s; [% i& C1 |# a
<?php- S0 i4 |! _5 I9 K
/*
! W3 z( w* P& H+ J9 L Plugin Name: Site Wide Notices Plugin
. M/ U8 E: N6 B2 Z" A Description: Adds a new custom post type for site-wide notices.2 V/ \* M2 Z7 G. `2 g
Version: 1.0
1 S% }$ p! I' K Author: Your Name" E% x6 [ ]' M- f+ p# v
Author URI: http://example.com
2 p' A( P- @) \$ T* R. | */5 X( S; d4 c, \( V2 ]
. F% b" t5 O! [/ j) B
// Add plugin code here...
+ B4 F% r K Q5 q ```' o6 z' T/ z) F7 u
9 t C5 S1 M$ K, K; Q' a 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。6 K# O: |# o, U: G* W" `
' s8 o2 |- D: Z. J' K4 m2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:. {. a2 a1 S3 r3 ?8 L
6 ~+ n. {0 ?8 A! E3 a2 P
```+ S) n8 ]" f6 l. S( s& m9 o }0 ~
add_action('init', 'create_custom_post_type');
5 E; M; E ~: m. i N* K function create_custom_post_type() {2 P' u& g( I" W. W- m/ l. C Y
$labels = array(9 d* i. g- y5 s8 j1 V, I) }6 x
'name' => 'Site Wide Notices',
. W; ?. f# ?" N$ C: _; a, @ 'singular_name' => 'Site Wide Notice',
7 \. t) L- X$ |" O+ _1 |' b7 f 'add_new' => 'Add New',
' X2 \/ U/ N) b7 g 'add_new_item' => 'Add New Site Wide Notice',
% t p& c9 I" m* `5 p 'edit_item' => 'Edit Site Wide Notice',3 s% k4 H4 Z2 j! M8 H$ C3 Y0 M) n
'new_item' => 'New Site Wide Notice',
, I0 u* S, p0 V6 P* u' K& j4 J 'view_item' => 'View Site Wide Notice',; V- `& F/ P* l* w; m$ L; _
'search_items' => 'Search Site Wide Notices',
r! y9 p# D4 x. O) p' A9 `3 A 'not_found' => 'No site-wide notices found',
( P& Q: y: r4 M 'not_found_in_trash' => 'No site-wide notices found in trash'
! c. _+ z7 f A3 u );
1 T2 h# Q( k2 k& N; Y1 ~9 f+ @8 d, i- s1 x: K$ L1 [
$args = array(; M3 B: Q- X. N
'labels' => $labels,- ~. Z* u! K, \! ?5 ?
'public' => true,
- C' c: X* O6 N 'has_archive' => true,* }: @8 Q7 N b2 Q8 } H( L
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),' c F) i( I" m4 T
'taxonomies' => array('category', 'post_tag'),
% x+ Q9 U& X$ [0 b7 Z. z 'menu_icon' => 'dashicons-megaphone',
* F0 z2 d; B% T3 c' U 'menu_position' => 5,: ], ]& @; f( }4 A0 ]: x
'rewrite' => array('slug' => 'site-wide-notices')$ s6 W! s9 e. x e7 _: D
);: U. i* Y: M: f( P2 Q2 }
% m4 S* B; X. I4 {# [% L
register_post_type('site-wide-notices', $args);2 {5 w9 m6 L5 ?: c( D3 d h
}+ v8 ^3 D3 ]: b$ S
```
- s% V4 g# c7 e& i; v' J; [% A* ~
- A4 V' f$ N5 k9 ?: k, C0 X( a 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。. d; g# M S' X y. C. W8 {0 ^9 M
) G- Y$ u1 `( s) s; A( V( b& b7 E
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
% l7 V* ]* k. D: i: P1 d" i, g# g4 \ t* _7 d& t3 H+ ?; |
```
8 m" {* b, K( d1 e/ j add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
4 t+ k& F1 x: I" z; y E& ` function add_site_wide_notices_boxes() {
$ W- N7 X! m- H2 X, X$ k9 q: ] add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');9 M6 G# u; u: y0 x
}
" ^1 @1 n" N% ], X( s9 |5 m. D4 L3 @+ U T/ N) x
function notice_details_meta_box($post) {
1 C6 R5 Q" p) Z wp_nonce_field(basename(__FILE__), 'notices_nonce');
) _/ l8 f- Q: S $notice_title = get_post_meta($post->ID, 'notice_title', true);
0 Z- k1 u8 M& [2 _- n* e3 u1 \ $notice_content = get_post_meta($post->ID, 'notice_content', true);& u: |" }" [# {% Y$ B& D$ @1 K
?>
% h$ k: e, |+ } <p>9 A6 ]1 U ], o6 Q$ f8 t4 P
<label for="notice-title">Notice Title</label><br>
/ I; g$ F: J: N, m" b- M0 s. ? <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
7 u( ?& P1 j8 T4 w </p>$ H+ i; C) F1 X d- q; B9 W
<p>
# P* x3 V+ I2 C8 V6 `! A. B5 _ <label for="notice-content">Notice Content</label><br>
. u0 l+ \/ {% b W$ v <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>1 c0 q- }3 b& q5 Q/ C' o
</p>" Y4 A% X$ N/ o9 K/ S5 U$ o# b
<?php y" U& w6 z& N2 w9 O1 @# T0 W
}4 Y: k5 ^3 J9 P4 O& r
. u4 [, r2 |: [' e. Q add_action('save_post', 'save_site_wide_notice_meta_box');
# y% U- I& `# Z& P function save_site_wide_notice_meta_box($post_id) {
6 V- _6 w; J, @/ O% E# n if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))! s Y! [( y. u
return;
( c# w0 _( k* L; Y' o. f if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
" m3 [% ^1 c" ~/ B. z return;
' J, d1 i$ x ^1 f
7 m8 k; d7 I6 N( A5 i; O1 | if (isset($_POST['notice_title'])) {
5 @' T2 q: j( i: M2 K6 d update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));; l# H" E i- a+ m
}
" h: e. N! Z$ N( ]: ` if (isset($_POST['notice_content'])) {0 O/ v+ ? {6 e+ w+ ]7 W" [6 C& L
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
5 ]9 a3 N" t7 C }! F3 u- J; U6 R
}
( ~5 W$ s. Z8 G4 ` ```
! z5 \; i* @9 o2 ~" D- B7 P/ W. _$ r! [* K6 t
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
) D$ Y# U2 k G! }1 `4 \$ u, L% e* s8 z6 Z' k) S' L
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:' r) ~2 d" k% O- V- i+ v- Z
, g, |0 z& H1 P5 k6 \0 O' n ```
- f8 T' S! m# c$ l8 p $args = array(
# k8 }( W6 u8 X# B% a* Q+ l7 r/ o 'post_type' => 'site-wide-notices'," X7 o* ~. S% Z9 d- |
'posts_per_page' => 3,
+ ], ?0 }$ p6 l5 E 'order' => 'DESC',9 W8 m) E! C" }! p
'orderby' => 'date'0 H9 x- p2 y/ h
);
7 H1 ]* V; v, l# y: V$ X" N0 g: C; W4 o $query = new WP_Query($args);
* y$ ?) L; m3 _& J3 b( X, K1 @3 P6 t if ($query->have_posts()) :
) W! F) R* _+ h) |( x while ($query->have_posts()) : $query->the_post(); ?>
; k) M* x6 _; _! x* i' ~" H( M# A <div class="notice">
, B2 X+ k! h4 s1 N <h3><?php the_title(); ?></h3>
6 [' t4 ~8 {# E! ^& t4 i# N <div class="notice-content"><?php the_content(); ?></div>
1 r8 \! A" a; o) a$ ^3 v, E: q" s </div>0 z+ `- n8 H2 B
<?php endwhile; k( t6 b. O3 p9 v1 O8 G
wp_reset_postdata();* G9 F3 o& [% g: A1 d* f2 i
endif;0 c+ s% H1 k! E! P% w3 |& s
```' W- i' }) y+ h6 c+ v2 v! {+ D
: g( k+ w) t, w5 J+ H, k& @: } 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|