|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?! @% J, g' V/ q
3 i+ e! m! H: d如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
; X) y J" v5 U- N: |6 {1 Y; V! J6 M3 w& ~! Z
以下是创建自定义插件的步骤:
/ C0 j, _ F" k- L2 A
4 z5 Z: z; t% f/ n1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:8 c7 a7 y: ~5 X
8 B% t5 R9 D2 X
```
) v7 e* [ R) g: E Q. @$ D* J <?php
4 ?# {1 [4 g% e3 F$ l1 Q) x( d /*
: P2 A, J# f1 H" g3 m* e/ _6 Q Plugin Name: Site Wide Notices Plugin2 \; x# X, Y3 [0 {3 X) D+ E
Description: Adds a new custom post type for site-wide notices./ a. L+ m! q3 Z
Version: 1.0) m9 {9 ?4 a# L% H2 }6 T
Author: Your Name
+ |9 u7 e) s7 ]' s Author URI: http://example.com
$ \' T2 Q9 X8 \$ R */+ a( y$ V& p3 I+ ?" z: B" \
' p- E5 ^4 Z9 r2 M; E% U9 d/ y // Add plugin code here...
3 k0 Q' B8 E$ ~ ```; I: }( G3 O* R1 b3 ^" h" D w
$ g/ e4 H I3 \% l+ P 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
( _1 k5 \1 w3 F4 f& z9 r! L' D( o- i5 ` d8 Q2 x
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
* e5 H) w5 F0 ~( w
4 s$ f- A7 s3 U" `' S ```6 \6 I' @: L9 `4 i; j5 F
add_action('init', 'create_custom_post_type');$ Z5 s! m e$ A# Y( F- [: _
function create_custom_post_type() {
6 O# U2 C0 D7 y* M- L $labels = array(& z# m% Z5 R# _, M1 s- }' ]
'name' => 'Site Wide Notices',
" }5 |0 ?3 {+ x, Q4 u: y+ b3 z 'singular_name' => 'Site Wide Notice',2 z( {6 j: w6 L `9 d6 J
'add_new' => 'Add New',3 h+ T# K% V7 \/ M% F
'add_new_item' => 'Add New Site Wide Notice',
+ ^2 b6 Q+ {/ g/ O+ u 'edit_item' => 'Edit Site Wide Notice',
! {/ v/ j5 Q3 m# c9 X7 o, R 'new_item' => 'New Site Wide Notice',
2 X# I O0 D0 O) y 'view_item' => 'View Site Wide Notice',
* x$ Z2 C: r7 F$ J/ y5 s 'search_items' => 'Search Site Wide Notices',
# c+ M* ~2 ^& ^# K8 y: h 'not_found' => 'No site-wide notices found',
, b: ]) P6 D: S* z 'not_found_in_trash' => 'No site-wide notices found in trash'2 o. k' i9 w! b5 N8 w
);
6 J3 |& K6 E7 G2 t4 a* F( G% D9 G9 P3 l8 M3 ]
$args = array( A+ F& ]. X- H
'labels' => $labels,
9 L3 w4 G) b/ Z: j# P 'public' => true,1 m8 U: X8 t* Z, A/ d" E& N/ Z# t
'has_archive' => true,, G+ Q& l7 i& P. J1 d+ g
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),1 }$ m( l! A' W( t) i5 v' B9 l
'taxonomies' => array('category', 'post_tag'),
) P& ]; ^3 ~& q4 \. l 'menu_icon' => 'dashicons-megaphone',
! n, e- @2 e' j% @8 c: R5 |" [" ? 'menu_position' => 5,8 ]% k- l3 J: U! F5 F6 ?2 C
'rewrite' => array('slug' => 'site-wide-notices'). e \8 ?) @1 A6 h; z5 Z0 K; p
);
9 C' r& c0 g2 E2 i( ^, }) D6 v
8 F9 u% e; i6 ^2 g register_post_type('site-wide-notices', $args);% j* L2 |! K. \- n9 D6 ]! |1 }4 a v3 u
}
6 g; Z0 K# B% ? x; ~# d ```0 [& l9 M: t2 n# D4 u- }
% ^: v6 V! n& S/ N 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。/ a5 V1 P& |7 w
, C5 W4 |: b2 a+ j) @
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
) H8 j- D3 c* Y. ^1 y4 k0 L" {& A3 N" o% N6 |
```
+ e- s1 f3 t$ w- F1 m add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
7 [) Z' v- c$ y6 @) [" A function add_site_wide_notices_boxes() {) p2 S1 |0 i1 K4 f. A7 _& J+ r
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
3 H) Y2 |! A& p! X% w }" R$ S. U O+ b$ s+ C p
4 m O, r. k5 Q- D: A
function notice_details_meta_box($post) {. K) G, O) X! ?* d: F2 x
wp_nonce_field(basename(__FILE__), 'notices_nonce');
9 w" ~( i p$ Y# U _ $notice_title = get_post_meta($post->ID, 'notice_title', true);% @$ Q) I: U' b% \: _
$notice_content = get_post_meta($post->ID, 'notice_content', true);
& s% }& K1 F* E- y, x4 i8 ?$ u6 X ?>! q5 B9 @; w7 v! ^7 ^/ K4 _
<p>
: |1 G7 f4 w5 G K( e' K <label for="notice-title">Notice Title</label><br>, L* }1 ^9 F1 j
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
q p7 G5 V: ~% @ </p>
2 e1 ^- v3 Y- b6 [ e3 B <p>
. G( L5 C' S5 K$ Q" G% _+ L& L% U1 M, i( t <label for="notice-content">Notice Content</label><br>
& K5 |% W$ p- g <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
) S8 A) R6 i( u1 }+ M& L3 r: U! h </p>$ `3 g5 R- E2 Y4 f! Y
<?php5 B! P" t& }3 P; p
}% R4 u0 I/ t* e1 l, |9 I
& F8 p b; \' Q+ g9 n- |* [ add_action('save_post', 'save_site_wide_notice_meta_box');; ^# P$ o6 t/ p
function save_site_wide_notice_meta_box($post_id) {
, D7 z* h \, j! Z( X- c% u' l7 d if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))4 H `$ G, K2 v
return;
5 v. N/ d6 t, W if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)6 F# x# U$ ^: s8 e9 ?
return;9 Z, b( v1 n7 y* v! E+ U/ p( [
. j: Q5 _; @( X" C if (isset($_POST['notice_title'])) {
. o# _' y" k! G1 A) o update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));; h, I! W j- k2 s% u0 N: t% H: v
}% y$ k( {' c! Q8 c0 I7 l9 \5 |
if (isset($_POST['notice_content'])) {% n% d# q# L0 k, [# r. U% k
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
, L7 Z) P8 r! ~/ \7 y8 T }
( B; V! ?: _' a8 G- @/ @ }
8 m5 m* \( \1 V+ ` c7 W8 G, c ```/ Q1 x4 F8 L g; p u8 T
, s; O0 v7 `1 S/ g, v! Q6 s
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
. I# T7 N) L% w, q" ~8 d7 S1 N. N1 x, k' o
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
2 e i* ^0 k5 E# h
, q9 J5 u4 a2 Y+ W7 M" T0 J" @8 M- i ```; E! U7 }2 l5 ~$ J
$args = array(" p6 E0 O) b6 w5 D c
'post_type' => 'site-wide-notices',: g; P- {6 w5 H& B
'posts_per_page' => 3,
6 u+ r1 W$ V. n; c9 s 'order' => 'DESC',* t* d: c" X( P8 Z8 u* X3 U
'orderby' => 'date'
8 E) e$ P$ n/ q: @3 Y );2 u, |+ R- i1 B) c# K# v R6 G. F
$query = new WP_Query($args);$ k, ?1 O' B: Z8 r; Q
if ($query->have_posts()) :- `3 d- \" G9 c q' b/ c$ _9 o
while ($query->have_posts()) : $query->the_post(); ?>
; g1 m- d/ w" ]$ y' N! V <div class="notice">3 {5 K; c4 R2 W* G M( p9 K
<h3><?php the_title(); ?></h3>
% k) S7 Y2 s6 d <div class="notice-content"><?php the_content(); ?></div>- w" u1 m; T; c4 V6 A0 \# ~4 I
</div>7 a, e8 H# T1 f" }
<?php endwhile;
9 `1 x& j2 D5 [8 a7 m wp_reset_postdata();
6 X% g; T: U9 I+ g5 T4 @5 w W7 H endif;
w$ ]0 P2 `+ z1 p) P ```
$ q! X8 G, z0 s: U
: V8 d% v1 x9 @' G( t 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|