|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
" C! _* I: u% V8 E5 d
7 P, X- t8 h1 E6 [8 ?3 {8 H% j5 N如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
1 K- j/ J) O- m3 p Y5 q
& F% R2 @& K' y% J8 e( p7 C以下是创建自定义插件的步骤:
5 n8 @8 E, z# f3 R' A1 ~! {# D6 p
( |5 b; P4 c+ C+ e1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
3 {$ _1 d3 y# I) }1 ?, S& T1 Y" s( w$ {
```( t }+ |( P& H; A' e
<?php/ E" V. ^+ F; b7 H1 n7 N
/*3 K$ L2 p" G9 _% f0 c/ h. Z
Plugin Name: Site Wide Notices Plugin
# S- j% P" P! j: Q Description: Adds a new custom post type for site-wide notices.
- ^) B- M9 E; N/ T2 k s! n Version: 1.0$ {/ Z. m1 Y7 G0 d _) M: v, V+ c6 c
Author: Your Name" j" W' T! S. L& ]
Author URI: http://example.com, F" u; I7 Y8 ?: F* ?& y
*/& N9 s! L, H" j1 A) j3 K$ o% T0 g. p
4 D( b' }2 ^9 Y+ B // Add plugin code here...
5 P7 o& x6 S' s ```
$ b3 w* u, k+ Y' ?6 M' A3 {, F, t: `
/ u+ b' ]7 V9 E$ o 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
. u( N; x9 s' k, J$ r; r* K/ W: F M
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
6 d% S# @6 a4 Z! [ T" l: J% v. k4 j8 F# y
```4 _/ w0 g9 x% v+ [+ D( U
add_action('init', 'create_custom_post_type');: p4 i/ f7 ]) g, y. \% e
function create_custom_post_type() {& _) r) y0 E. c: B
$labels = array(
" N1 d3 {; n, ^/ r9 |7 D# ~2 I 'name' => 'Site Wide Notices',$ \: _& d( x, Y* k0 v
'singular_name' => 'Site Wide Notice',- r, U h; r6 q" R6 b
'add_new' => 'Add New',
& H* V" p( y; l4 S2 C 'add_new_item' => 'Add New Site Wide Notice',
- J' F8 x; P! N4 i# S" j 'edit_item' => 'Edit Site Wide Notice',; R8 t, K9 d! K* l# m
'new_item' => 'New Site Wide Notice',' r T( S1 P$ B
'view_item' => 'View Site Wide Notice',! @# Q6 [5 I' O7 Q0 D( q
'search_items' => 'Search Site Wide Notices',) _* Z3 B' J6 b% a3 a" O( t
'not_found' => 'No site-wide notices found',' [6 x @. C, p- D1 u
'not_found_in_trash' => 'No site-wide notices found in trash'$ X1 z* f V5 O1 d
);+ H& T# G: S5 D9 I4 b7 n, q$ A
5 c. F( G$ p( x7 p) H$ z $args = array(
# G0 c2 Z$ {% ~5 }8 l 'labels' => $labels,
) g- D: ?9 N$ X, }7 _/ w 'public' => true,
. S ?, q, ]7 j2 E: f" K9 a' @- @( r 'has_archive' => true,
. E, g0 m. P8 W+ u2 p! C 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
0 L! S" n- O1 u8 h: L9 _ 'taxonomies' => array('category', 'post_tag'),- g$ g3 a( B0 U* u4 x
'menu_icon' => 'dashicons-megaphone',8 F' w$ k$ c2 ?! e1 r: h
'menu_position' => 5,& S7 J9 t, H* ?. w2 `
'rewrite' => array('slug' => 'site-wide-notices')) A, s0 ?: c. I7 ?; J7 \6 V m- w& c. Q
);7 N- f/ n9 k( X7 b
- @( ]" m' g: z# X+ p: E register_post_type('site-wide-notices', $args);
3 E6 h% I0 {% _* R }
8 Y( a+ I% \. y) ~" Q } ```
- H% y8 s6 ]# G7 k/ T$ c, O6 c- s# A- b# W
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。# @6 o3 N* o& y1 J' a( T
( c k% G7 T" G7 H
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:4 H9 B& i" R& n- E* m9 r! G5 [
3 D1 c& V) S& t7 t5 v0 r
```
9 t! G1 C* s9 p2 w, m add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
; J( |1 q, P( H9 D& P8 k function add_site_wide_notices_boxes() {
( j) g" l# O2 P7 X add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
1 M* m" w' O! l( E }" T2 x" C- _! p* Y5 M: i
' W6 K) D/ y/ t3 g: J
function notice_details_meta_box($post) {
1 k @# l- `0 Y- }2 D4 u wp_nonce_field(basename(__FILE__), 'notices_nonce');8 g; x8 @, a7 E2 P
$notice_title = get_post_meta($post->ID, 'notice_title', true);
% u2 Y5 O9 C) T$ t7 K& I) z3 \ $notice_content = get_post_meta($post->ID, 'notice_content', true);
5 `- d- K5 c0 \2 L ?>. t* m& z- b/ Y7 \
<p>+ W4 w; T- P- I
<label for="notice-title">Notice Title</label><br>2 d" w* d, p/ M: `6 D, z; Q
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
4 j$ ] d( o' r& M! R </p>
6 a8 M9 l2 v" m# { <p>
$ q( u& e5 B$ ]- k <label for="notice-content">Notice Content</label><br>
1 f% S( \, F/ _, t5 J$ {# X <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>7 R& K1 f( W( \0 `+ x3 B
</p>
! u' O N# C3 W7 j0 A& a <?php
3 e9 }& ?! D9 {. u* N$ Z* ?: ` }5 h* {2 W" J: {5 C, F% p. T- _
- T9 P. u0 K) A1 L7 V L3 ~: Z5 n4 r
add_action('save_post', 'save_site_wide_notice_meta_box');
4 J6 a, b) s2 O* s5 E( I' _2 W function save_site_wide_notice_meta_box($post_id) {0 f( ^0 w* l9 ^" d5 b+ m9 t; |. l
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
7 r2 e! |8 C: I# J x return;+ n; w- s6 _# O% e
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
+ [$ S6 |! V- c: l- X return;
+ k- n# `. w2 b/ h/ s; P! w
* l+ `2 G) S6 Z7 u/ g& Z Y& H if (isset($_POST['notice_title'])) {
7 ]9 w- `1 B* p$ L0 F& K update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));: [! M+ O) T: U5 p8 W" V
}1 E; a$ \$ N! ?
if (isset($_POST['notice_content'])) {
" ^# u4 d1 H/ e) H update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
5 `: s4 E. k$ B0 X5 ?' k) x- ?) e }
3 f5 k5 a: s2 J2 t }8 ^3 z8 {8 k4 H' a
```. v. i7 [$ D7 a- i) f) h
" H7 S+ N5 M/ j$ X 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
. [% e% w6 T2 ?7 @" w7 ^6 x' O) Z7 B( ~: {6 @5 ~+ N% g+ q% V
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:; x, D- x/ {7 ?3 I v
K r) E' l. g! _; }- B% G ```
: m: I/ {+ G I) U& q8 h' q) s $args = array(
9 u+ P! r6 t) W% F 'post_type' => 'site-wide-notices',
' M* n8 q+ u6 s& M. Y- w0 j 'posts_per_page' => 3,2 W' ?5 S+ w4 A4 p3 j- g
'order' => 'DESC',% ~ l4 H Z2 b! {+ q" K+ D
'orderby' => 'date'/ F* S) e6 H( K3 O/ F; d
);
* M. Q- I" n( Z $query = new WP_Query($args);
1 c% R/ K, G6 {' D& r if ($query->have_posts()) :5 E% ~: n7 h5 z/ D$ w% E4 i
while ($query->have_posts()) : $query->the_post(); ?>
3 J) l2 I; E$ P% b <div class="notice">" V" `( Q2 r+ Z9 {
<h3><?php the_title(); ?></h3>
) z4 r: ~4 d( A% t <div class="notice-content"><?php the_content(); ?></div>
5 E) ^& y4 |9 a6 S k5 K </div>
. J8 l6 t( R( R" _; Q2 @ <?php endwhile;9 Y7 j$ t" ?% @0 ]& u
wp_reset_postdata();- T" t |4 ]; K% H
endif;3 y6 ~4 F+ Z3 p0 ^) k
```8 }; ]" n5 z* ^5 S) s2 W
! |, g; a% k/ \$ O5 ^3 ^+ [( U
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|