|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
( H# a8 i' ~- B* o1 M+ {; Y1 B- t( u- i2 l
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
( a$ a/ H8 y8 u8 F, n) t6 i5 O1 Z# d" c: \6 R
以下是创建自定义插件的步骤:
; \% s* L" C3 a3 F. d" u8 `6 c$ L4 w. l* ~/ R9 J9 A3 t0 `
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
) a2 V" c* P0 L& P
: y" O* q" w% V. M ```6 B' x/ b8 |* r4 r& u% ~, n
<?php
" ^, L. m* Z2 H, w7 U! ?6 b8 l% L /*
- h3 W8 s5 u* M( n+ j- ] Plugin Name: Site Wide Notices Plugin
* X) \2 e" i: |! F7 f; ` Description: Adds a new custom post type for site-wide notices.2 r- K( P* [7 m# ~( \
Version: 1.0. Y6 [# f# F* P, }6 T. A
Author: Your Name: h! Q" f+ F- b# Q. F* u
Author URI: http://example.com, t( T' _+ T) E+ x M; m, N
*/% ~ s. v- P- f
5 }, N \' u; T% O# @6 A( s0 t0 e- `
// Add plugin code here.... i- p6 |- T# C* w% j& J
```
2 r0 c, w! N$ c* t+ j7 K: u7 E! u+ J; X% L: J& p
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
3 z0 z/ n6 w, C7 A7 V: u1 c- a
# e+ B$ r; r7 g! \) E" r2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
' e; v) H- g4 t
) \& q8 [# V5 m( V# Z ```
, H9 B4 V, F) [* v. ~. b6 O1 O add_action('init', 'create_custom_post_type');
9 v6 ]6 M+ {2 ~& c+ P* P function create_custom_post_type() {
/ H% |! T6 ]) S5 K $labels = array(
" W8 J# `) j. G0 t- s( S. i4 @2 g 'name' => 'Site Wide Notices',6 u! @0 P9 D7 C
'singular_name' => 'Site Wide Notice'," F- M7 U5 w o: o; u: s$ o
'add_new' => 'Add New',* B0 x. L! h6 F4 d/ S2 X! C
'add_new_item' => 'Add New Site Wide Notice',
" a: y+ \. L* b* s( j 'edit_item' => 'Edit Site Wide Notice',. g: w4 W- P0 B8 E/ [" i( t
'new_item' => 'New Site Wide Notice',) s0 m' L* @& `8 R% Q1 O
'view_item' => 'View Site Wide Notice',
, G3 Z; ~+ S4 d" k. L 'search_items' => 'Search Site Wide Notices',
9 B% f- W: V6 A1 ~: K! i& E, P4 B) C s 'not_found' => 'No site-wide notices found',
( j% d& j! z4 R( x1 T2 w 'not_found_in_trash' => 'No site-wide notices found in trash'" X: D8 {. A. L0 O- o% ^7 J- D
);
! F& h. H3 g" M0 R; U. a0 C- I7 p
$args = array(2 A9 A V! R3 k1 r3 X3 U
'labels' => $labels," R5 T, V; j! D# |0 k# Y
'public' => true,
+ ~2 ~3 U7 ^( ]% ?" c3 h7 ^1 a 'has_archive' => true,! d7 J: J/ m1 ~0 ?; E
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
j2 r/ f' ?8 y) N* z; } 'taxonomies' => array('category', 'post_tag'),3 Q4 y( F7 e% u+ ~
'menu_icon' => 'dashicons-megaphone',
~# R6 E% f1 g" Y, n 'menu_position' => 5,
2 J7 R/ e8 _9 n! B2 t: M6 R$ `. f 'rewrite' => array('slug' => 'site-wide-notices')8 e n6 P E* A/ J
);/ L$ a1 s n: w" g4 ]
/ c Z- S% }/ ?$ I register_post_type('site-wide-notices', $args);
/ |7 g( u9 y; j; w- T' z$ Z }
7 h" R" ^7 W- p ```' n$ y7 v& w- m Q8 v! n! X
% j) l# ^1 u# T+ b9 M' F 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
% y: p- v) F8 B) N! G
' d/ M% A3 S/ k: J: x& X$ v6 h3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:0 v, ^* h& {, u
( Q. x+ \+ N, U% } ]
```% z% I+ q* u4 L* C H
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
+ |0 F- u& o0 q# k6 L4 X function add_site_wide_notices_boxes() {' N/ ?& S) ^/ D
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');, `' f$ R: _; D2 `
}" A3 C9 G- c2 j0 u) e
9 W7 ]0 x3 `; s4 n2 H
function notice_details_meta_box($post) {% d% v( U* v1 a' `- Z5 h
wp_nonce_field(basename(__FILE__), 'notices_nonce');) s& Q# |# S" J& Q
$notice_title = get_post_meta($post->ID, 'notice_title', true);, _. q: x% y! @- ?7 q
$notice_content = get_post_meta($post->ID, 'notice_content', true);
/ P2 `4 D; N" }$ C ?>) Z$ e* k0 k% U% ?5 ]# `: i1 x
<p>
8 @( N( H- I0 e: ~; _0 [& J. c/ C <label for="notice-title">Notice Title</label><br>5 y6 x$ `- v9 v+ {
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">& _: o' u- ]' {! N6 r3 z
</p> C+ o; Z# C/ d# u+ } [5 q
<p>9 ]" c! ~) o9 Y* I
<label for="notice-content">Notice Content</label><br>- z) f8 l- X. ^' F3 T4 U
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>' E2 d% Y, x8 g; D3 I
</p>$ @5 y6 }* S3 R! q# ~ s
<?php% n, V r& a2 y+ k V
}. B; G7 q c: y! X4 L+ ?
! ^7 n3 Q, `+ c& ]- m8 z7 a6 G add_action('save_post', 'save_site_wide_notice_meta_box');' `* R9 L, B+ h) P: ~; v) g" x
function save_site_wide_notice_meta_box($post_id) {) B! @, l0 A4 j7 J" v% Q
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
' f& A. k/ K% E( q* Y return;7 n6 K/ c2 o# L: E) w" [: }# }
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)' v# A+ z0 ?& X- o* t, |
return;; E. `0 a. c- s
% H- j* D/ _) U% ~3 J$ U) S, x4 f if (isset($_POST['notice_title'])) {. }6 r8 p6 j/ w. W9 l. N. d2 g/ ]0 o
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
+ l' [1 f+ |2 I7 O- h( \0 g0 i9 p } d! t ]4 g `. i9 v6 ?
if (isset($_POST['notice_content'])) {( s, a& B+ M1 i7 p& r
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));0 J; H5 c. @6 E, F
}
- U$ u9 ~0 L3 Q, ` }5 C; S) w4 `% y
```
- J, T3 ^3 `1 ~% N/ p. Q
/ O" w% H, p& b8 R) s 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
: R+ ^" v- n) b9 o: K a. e" N6 J0 y, F) O0 q# e
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:" k# A7 d5 R" D+ \6 B, E3 l3 L
- L% g* W2 r L. Y& D( ]& Y ```
* c. G* C: _8 s/ W5 n1 a1 N6 V $args = array(7 H6 R' J2 \ H0 J# f* o2 B: Z
'post_type' => 'site-wide-notices',
! Q: C( D7 X. c# s 'posts_per_page' => 3,
# \9 a' R1 L2 K/ c 'order' => 'DESC',5 b3 _ @1 _; m+ Q6 N+ b' p& d
'orderby' => 'date'
h) Q8 k7 E4 J5 v );. V, e1 m( C% v2 T
$query = new WP_Query($args);
/ _( r( r6 d; e6 I% T3 L if ($query->have_posts()) :
$ o2 q/ U. q5 q( @1 I while ($query->have_posts()) : $query->the_post(); ?>0 B9 L ~4 j; X1 |7 t1 V
<div class="notice">
" q7 n1 w) K; O4 g <h3><?php the_title(); ?></h3>; d, b f, F2 r
<div class="notice-content"><?php the_content(); ?></div>2 M: J6 O; o9 f% j3 l- \
</div>" t. S9 U8 r) C3 Z# u# ^
<?php endwhile;$ G% J0 b2 b1 j% ^; J& b
wp_reset_postdata();
9 B T6 g3 d% u endif;- e& A3 } `9 O% R; Y, I5 Y
```* t3 z* d1 X' t; _( W$ {/ i
! P6 x( R Y* E" } 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|