|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?5 ^2 t6 v% C' ~+ D2 F* g
, i( u, ?+ E2 ^/ B% b/ y4 w如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
0 S( ], J o( P" r" @0 \( O% `' u9 X8 o: h, X
以下是创建自定义插件的步骤:
' F: F; V2 J. e' Z9 C: X H0 r/ s+ J; F- \9 g
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:3 W6 C, i5 o g7 T, t
0 @. t1 A# B7 h4 z) Y. [* Y
```
6 F6 [6 v' G5 n' L- _# _4 Q' ~ <?php
( S: }% V5 M. d5 p8 ? /*
; j/ g% `1 Y" g. }4 W Plugin Name: Site Wide Notices Plugin/ e+ Q5 ? L! B% I9 p
Description: Adds a new custom post type for site-wide notices.6 u( ~ W! _8 @) q# @
Version: 1.0( |4 T- |' W0 `& m& P& e+ L
Author: Your Name
" b; W$ z! c4 n' ^ Author URI: http://example.com3 o2 p: R7 N1 c9 A# n% z. P
*/8 z6 F0 p7 J! [. T% a& h
+ Y& S0 S( p2 Q& N% P
// Add plugin code here...
/ Q% }- m c" {; b1 i ```9 S2 @4 w5 W `7 B6 p
& C5 i! s0 O2 j3 z' c 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
& @' H/ r! I3 e ^2 Q
6 O6 r1 ]; U* t( t- X+ c; M2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
N0 R8 M# v. G7 R8 ^1 W- F& Q
- e f6 @! M3 T2 K9 D S ```
6 F* N3 Y+ c3 m2 }' h5 Y$ N/ ~ add_action('init', 'create_custom_post_type');: V5 [" i0 K2 ?+ O
function create_custom_post_type() {
, U' `6 g* r2 _ A $labels = array(
: M+ N, p5 [; T0 p7 v 'name' => 'Site Wide Notices',
) ~$ g3 O7 ^$ U' b2 {3 `3 p 'singular_name' => 'Site Wide Notice',+ M6 `5 G0 H2 b( z
'add_new' => 'Add New',
4 |1 p( p" [0 y, x 'add_new_item' => 'Add New Site Wide Notice',5 |3 u; U3 h) X- P% X/ _) Z
'edit_item' => 'Edit Site Wide Notice',
, }' b* a4 S2 i- [1 v 'new_item' => 'New Site Wide Notice',) X( o1 r# M5 ?
'view_item' => 'View Site Wide Notice',- A2 X3 f2 f" e, h2 v+ N: B0 @
'search_items' => 'Search Site Wide Notices',
% T+ w* L L# j m 'not_found' => 'No site-wide notices found',
i1 S" l. L- O+ m/ M. D 'not_found_in_trash' => 'No site-wide notices found in trash'$ Z) H: t$ e4 O
);
. y6 x* j; g+ p( Y' B' q4 Y8 \7 ]1 P' C7 e
$args = array(
5 _$ d8 i i+ L" o2 K! e 'labels' => $labels,
, I& o# t0 J' b" J3 T7 x 'public' => true,
5 {+ c& m, J$ T @ 'has_archive' => true,6 m4 u" i( n7 a1 s" p
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),9 Q `7 \; x' S) P$ [ I
'taxonomies' => array('category', 'post_tag'),
5 }: D' ~- Y9 A8 J. J* f& E3 e 'menu_icon' => 'dashicons-megaphone',
, r, ~+ a$ Y+ l9 C9 u9 J 'menu_position' => 5,8 M3 r4 }& V+ M% a; S1 O0 i
'rewrite' => array('slug' => 'site-wide-notices')
% t) N, G7 }/ R. y4 @+ f% u );
! P2 v& B# x4 a
" B k7 ?1 r/ w( B- L8 O register_post_type('site-wide-notices', $args);6 D2 `/ q7 M# r; b
} N' ]* K" I- i* T1 K# [) z
```
5 ~, D) O B) U( q9 \8 z4 V x, v( u/ S% D. s2 {' K6 V
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
2 y0 ]) o0 J6 p: n+ t3 I8 E. |) T7 ] j' i. P
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:- y4 @ [2 a6 h
/ b8 ~$ k" ]9 a
```
5 n' l* t3 {, X* m add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
/ j5 N) q5 @: r function add_site_wide_notices_boxes() {
4 G Q! n4 }# d& {# B s8 R R$ M$ b/ G add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');$ O: k; b9 J8 `
}
, {2 }+ h9 E* C0 U& q( d* { G, J
function notice_details_meta_box($post) {3 W; y+ }! g* j `) A4 k8 R v
wp_nonce_field(basename(__FILE__), 'notices_nonce');) o8 ~" ^/ D( J7 h$ K
$notice_title = get_post_meta($post->ID, 'notice_title', true);4 _ {0 \1 M. l! Q# i. S
$notice_content = get_post_meta($post->ID, 'notice_content', true);
0 Y$ b/ Q) @& v8 [7 r" \ ?>
8 }' N4 j n/ c! z/ u <p> T& n f1 B; k! ?- _/ H7 S# T
<label for="notice-title">Notice Title</label><br>0 e/ O/ b8 V/ g, F, ?- V
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">, h& q, r) Y7 W% j1 @% D+ }5 a3 r T6 H
</p>
# v; ?. k @% N7 e( L5 L [ F1 J <p>: B0 x' @0 p u# B
<label for="notice-content">Notice Content</label><br>
' F8 `: U. S$ _" `0 E <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>* r7 l2 o$ K/ f8 @' `
</p>
_3 ~6 ^: x6 ~ <?php Z3 h7 Y }9 v5 C+ X% l
}
1 T& E$ |1 |# f& ^) p
' G H" C& J+ ]' Q add_action('save_post', 'save_site_wide_notice_meta_box');
5 X; G( t3 y6 ~5 o8 S3 K! U/ ]" Q function save_site_wide_notice_meta_box($post_id) {
" ]( v4 q5 V& d1 }! K N if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))6 |1 O% Q2 L7 a) y
return;
% U8 F+ u2 E& L2 _& g; J if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)$ v2 U- N' M* _- J8 \
return;
2 q& @! Q: B3 b
; }: e2 S) J7 D0 ^0 t1 { if (isset($_POST['notice_title'])) {
& f# a& `! `; n# J) T update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title'])); I+ O& k0 s: z" v" v. L1 [" C
}
- K$ G4 e) i3 K9 @2 s# Y if (isset($_POST['notice_content'])) {
6 g& u) @( T- K4 Z# P update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
1 m1 Z- g4 r: P* ] }
1 m8 Z+ i1 V/ z5 B- D1 {/ y }' N0 `/ k5 k1 g) G" c$ n2 l" S( d
```
2 s7 I; Y, d! @5 z/ l
/ d9 B, n, A7 B; X7 T m 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
* ]) }) Y2 b; M5 z7 `( l D- N, P% u- Y) w2 @5 R; k
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
; L: W5 h7 \ O6 j! `% |" T
f9 ^$ r9 s5 f; Z6 _( R ```
' m, n/ P K$ x0 Z' I" h* k $args = array($ V. K- f% ?' L! {+ S8 O
'post_type' => 'site-wide-notices',
7 f2 z6 r/ D" g' v 'posts_per_page' => 3,
4 B. q2 ]* F0 l& G 'order' => 'DESC',
, p# y% ~0 y# h* ?0 v) C 'orderby' => 'date'
& j, I% q' A5 `5 Y* m' l6 ?8 ^ );2 H+ m: a( R- x# o% j
$query = new WP_Query($args);6 ^/ @; {5 A2 m c2 _
if ($query->have_posts()) :
q* b: M- i+ w; q. j while ($query->have_posts()) : $query->the_post(); ?># B1 O4 n% Z" M) B$ W2 n! F/ v
<div class="notice">
( D b6 q7 S9 J) D ` <h3><?php the_title(); ?></h3>
! x& k# g$ }! E6 q <div class="notice-content"><?php the_content(); ?></div>
C; N `" E. B+ N( ]4 y </div>% l$ }3 D2 r, e2 g( `
<?php endwhile;" y' \; c1 J [' ~3 M
wp_reset_postdata();
; |3 n% U* R( p/ G2 | endif;
& T" p! @' a: w+ ^3 O" Y ```
+ s7 Q% ^: t1 ^; ]9 ?0 l/ U
9 w `6 s% {: n* s L 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|