|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
0 u" X/ w5 L6 P9 `: C8 G$ k4 \0 y8 \ |* W# x
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
+ E1 t# W$ {7 n( Z( V1 ~
8 y" T' l7 d9 D# c7 ]以下是创建自定义插件的步骤:; G d6 f) W/ l! N; k
; j' P' D$ D. V& e8 k. a# t$ t1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:* o8 E& f4 m: Q) S% g5 P' h* }7 L, g, p
) n: [4 m# r$ G1 `* p ```! a; o; Y. K2 R! G& C U
<?php' p+ W( ?: w) ]
/*8 [# t, x: C0 |4 c% f3 S3 @* Y
Plugin Name: Site Wide Notices Plugin3 t& N7 {* a L4 n3 u/ @
Description: Adds a new custom post type for site-wide notices.
" {7 U8 s$ o' S! v Version: 1.03 U+ e, G6 [+ c8 c% a
Author: Your Name
6 l1 J: x0 R+ @; Q+ R1 w3 R Author URI: http://example.com4 w7 {, B( s0 S) @% X
*/# J% F Y4 ]% R$ r
) D1 n5 A+ t* k' @; o7 r // Add plugin code here...5 b" `/ K+ b! t* g. g
```+ b2 _2 v" U; X' L) R
7 b, ^* q: f1 h" ~, N x 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。3 k2 H! c" C1 F1 C
9 i4 \+ l2 y- y! [( X$ M
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:/ w D; `. G- m+ X
" d8 ?, y0 ]( ~* ~ ```7 P$ h0 k% T2 r1 p
add_action('init', 'create_custom_post_type');
' ?$ X/ r& d! I. e5 C4 A9 c0 @5 B function create_custom_post_type() {0 F/ }/ _; ^6 i( W" b
$labels = array(
9 c4 i( w6 H9 ^/ C* A4 Z, x 'name' => 'Site Wide Notices',
: r1 o$ ]; G; ]( {' c& {, X 'singular_name' => 'Site Wide Notice',! s4 V/ V1 G9 Z
'add_new' => 'Add New',9 D) O) @: U) u+ u6 k0 Q$ |$ W! u0 @
'add_new_item' => 'Add New Site Wide Notice',
, Y* g# P* z/ _4 Y, m8 _% h" H 'edit_item' => 'Edit Site Wide Notice',. J, U3 a$ p+ L) M- a& S
'new_item' => 'New Site Wide Notice',
7 Y2 [' \( u3 m! O h1 C 'view_item' => 'View Site Wide Notice',3 w- `+ l' y) R8 ^; r* g
'search_items' => 'Search Site Wide Notices',
* R0 j2 T, u$ @# p( C 'not_found' => 'No site-wide notices found',
! h% G0 D9 r( Q& ~5 | 'not_found_in_trash' => 'No site-wide notices found in trash'( m' p y: f6 X; d1 L8 L
);8 o$ {( Z5 L6 E; b4 w7 u+ j* W( p
- [9 r) z9 \% `! g& U0 e$ P $args = array(
/ M, a* @* I- z0 U/ ?$ X" j+ x 'labels' => $labels,9 P4 ]& ?+ g6 o) X2 C( N
'public' => true, s+ [- J B/ e4 K- d! h5 f0 D
'has_archive' => true,! W, e/ J6 M: \6 Z$ h- @+ y
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
* y% T" I' i* d7 u% K+ n$ } 'taxonomies' => array('category', 'post_tag'),5 ]6 q0 P1 [' c& s A
'menu_icon' => 'dashicons-megaphone',
1 ~, G9 d6 a1 b 'menu_position' => 5,! g! R( B! S5 j& e
'rewrite' => array('slug' => 'site-wide-notices')
Q: W$ @5 A+ F );
; f- Z* z F2 W z5 G9 x/ b% t& z) c, f& M0 [, d, U# F
register_post_type('site-wide-notices', $args);
, Q7 _* A$ g, J) {) G/ j% x/ { }$ m" B! f$ o0 D2 k
```
3 [: a/ N' Q1 i$ n
# t& w G; E* y0 M2 W 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
- f2 Y8 ~( ?* n7 j2 i2 E, @- ~' L/ G
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
, ^! a0 D! H8 d2 s0 q7 C$ b/ R1 }6 X' V6 \5 i
```$ W8 |/ Y1 \" x
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');) h9 \" `' n2 m' M6 p" B
function add_site_wide_notices_boxes() {
8 m! b; u0 W& I" Q' ~ add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
+ V3 Z3 K8 i1 Z/ w7 `6 B) @& | K+ L }) K7 y$ P/ y& D) h' d8 i0 D
5 Q1 W$ `8 Z+ i" L" s. Y
function notice_details_meta_box($post) {7 a1 S1 Y5 t3 H0 ? |9 U: t
wp_nonce_field(basename(__FILE__), 'notices_nonce');& y3 b; {3 ?# m: K8 r
$notice_title = get_post_meta($post->ID, 'notice_title', true);
- D6 d( o- n/ r& w $notice_content = get_post_meta($post->ID, 'notice_content', true);& n! [, L$ c& v; e' C- y
?>
" w U* v/ h) T& T5 e G ]6 p6 j <p>, e. R4 R" F$ a; q+ V
<label for="notice-title">Notice Title</label><br>+ a2 z5 Z5 C' e! O
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
. g0 ^6 J1 K7 M' J$ S </p>! P! a1 W. i; |$ Q' F2 e4 Z
<p>3 H# Z! W5 D2 ^0 O! m/ S1 N
<label for="notice-content">Notice Content</label><br>
" F& M8 T4 u: _, `; d <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
- z$ E) n2 D! Q2 h </p>
: J1 w8 J# O J <?php/ ~7 V, ]! g1 O; g9 }; g9 [
}
& e+ p1 U7 d+ k5 C* I0 ?
4 |5 q1 q2 y& N' N8 H add_action('save_post', 'save_site_wide_notice_meta_box');
+ [2 ?' d/ b6 X: {2 T. D function save_site_wide_notice_meta_box($post_id) {% ^5 w7 N/ _' H# A. S
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))); a# E7 F- V9 E/ G# V% j
return;3 J/ y8 I8 c/ e. }4 ^" E
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
( @4 u+ t T0 h/ z! U return;
3 ^: p7 @ A3 w! f
0 o, m. _! ^8 J6 F( k if (isset($_POST['notice_title'])) {
1 d& d0 \; l2 r update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
5 B2 f1 f3 M$ }- Y5 x }+ N3 S- o9 `% r1 h
if (isset($_POST['notice_content'])) {
: ?, c+ h8 \ ]! n update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));* E! T }5 \8 H$ q: x t [
}
$ R4 K2 R$ `& ?1 b% H }
! y3 d0 Q5 p2 @/ r" p2 R ```7 m5 s0 I/ k5 Q0 A5 n7 j
6 ]% u: s( e% R# Z, x6 ] 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。1 V1 b! c$ e5 m, |7 E
0 l# h& Q2 _- I4 H. \ R: j% g
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:6 ?! [2 r3 j6 G S( F7 w l# q
/ x, }1 x9 l1 m. ] ```. N/ `( C7 D" A, S2 \
$args = array(; ^. Q" U+ S) F2 ]2 K
'post_type' => 'site-wide-notices',3 i/ u% @; l) E: x
'posts_per_page' => 3,4 F! D8 E% h! y, M0 [$ n$ Z
'order' => 'DESC',
# J9 O5 N2 h5 a" }' P 'orderby' => 'date'
3 ?( v& J+ N3 B1 |( @! B2 P, s" c );- S% b3 n* }; e- t
$query = new WP_Query($args);) l' o8 ?- I% S+ {5 E8 |. a
if ($query->have_posts()) :) g) h3 L: I9 D
while ($query->have_posts()) : $query->the_post(); ?>
% W" ~% a$ R# F6 o1 f4 L5 i <div class="notice">5 h; P4 N5 O7 K8 O
<h3><?php the_title(); ?></h3>: r( L% _! o) h& E; |
<div class="notice-content"><?php the_content(); ?></div>* l" j y% c1 L6 r3 l" [. U
</div>1 Y( u j% s2 W3 |
<?php endwhile;
6 j+ i* k( B- h1 m& `* Z wp_reset_postdata();
I7 G% w8 |) Y5 u2 h endif;8 ?% |+ ?; b6 C- Y& N
```+ E. x6 G( |* k; F6 Y7 K* y
0 O. \& {. h* u5 [4 p# t 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|