|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗? k# r! ?6 C+ p3 C! e* H" @) _
' f3 Q; H8 g2 X8 P+ W! N% s
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。3 z0 x6 _7 E& _: O9 x9 P1 U1 F
0 B: G) @- q- i; A/ d7 L; s& p& ?2 r以下是创建自定义插件的步骤:
: l) k" A; m; Z' k8 b
7 p' L( {9 m# w5 ^3 o: d1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:% P4 U3 D1 f D$ V9 `
+ G: K3 H {/ b
```8 N' o" t- d% R# e1 B! a: H- C5 U
<?php6 c, o3 e4 }: D/ M6 U/ [
/*& O" }' k! m G) f1 y$ B6 W3 w
Plugin Name: Site Wide Notices Plugin. H [* ?) }8 Q9 j! P3 O+ e% ^
Description: Adds a new custom post type for site-wide notices.
1 B7 G& B' r/ M! V5 \ Version: 1.0
; X5 I% k. y# n6 E p0 s Author: Your Name
8 B0 O; M0 L6 R/ u1 g Author URI: http://example.com
& \+ ]" R f, \4 C */6 Z( d! {8 {$ O+ \: U2 K- M
3 V! b, N% o, H% o5 z+ g5 K // Add plugin code here...
7 N% ?/ Q" {+ Y, T ```0 o( V1 _# t$ i
" _, p0 w' n$ ~1 }2 H9 v' V; a0 F
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。6 b( d# ` {) t
, O* l8 R; Z# J% e8 W. ^
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
! b+ N; Q/ G$ w
5 C& A' L: {7 g6 \ ```
~8 i# Y8 \- i) c3 S add_action('init', 'create_custom_post_type');( E2 m) p' @. v# W
function create_custom_post_type() {4 E! |5 |& i! w
$labels = array(
- {/ X3 U( k2 e' a c 'name' => 'Site Wide Notices',
" S/ B" U, i" `6 _3 I 'singular_name' => 'Site Wide Notice',
' y# m! \4 A& Y" m8 e 'add_new' => 'Add New',
' G: b2 }8 r4 k+ | 'add_new_item' => 'Add New Site Wide Notice',1 u5 h( r4 w/ I
'edit_item' => 'Edit Site Wide Notice',
3 _; m1 w! X7 I* H6 u3 F9 ? 'new_item' => 'New Site Wide Notice',0 L/ e' |, Q4 s7 ^
'view_item' => 'View Site Wide Notice',# Q W3 Q5 [( X6 ?% x l. Z
'search_items' => 'Search Site Wide Notices',' a% R' c+ Z$ A; V
'not_found' => 'No site-wide notices found',
; F. p' \1 R# B) V5 F+ M# L 'not_found_in_trash' => 'No site-wide notices found in trash'
6 ? c7 U) j, W2 ` u' o );
- j9 Y0 {$ M0 d, H: m8 M. d t" ?/ N* B* O
$args = array(
2 g' B! \, C7 D 'labels' => $labels,$ h. U5 y3 V7 p3 X; o
'public' => true,; R: b1 j% w; g5 r1 V. K
'has_archive' => true,1 h! j5 ~( Y( m0 m+ T: {
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
% z$ k# p) H, H8 @1 ?, W3 E8 F/ i 'taxonomies' => array('category', 'post_tag'),2 R6 X$ y; Y7 m C: V
'menu_icon' => 'dashicons-megaphone',
+ r0 e) J# ~5 Z6 y5 o" e: Y5 r 'menu_position' => 5,
5 n ? l1 i0 G2 G5 C 'rewrite' => array('slug' => 'site-wide-notices')8 Z* V2 y: E3 P/ f; R
);
' V2 O& l9 m: f0 z: c4 |0 w7 a f# K. R3 g* D+ e# p K; A9 }
register_post_type('site-wide-notices', $args);1 K: \5 G3 F: p3 l7 u
}
9 o$ `/ P9 o1 v1 M ```! u8 R! ]( J7 x/ ?9 S$ B' d0 L
) T+ Z5 r! y9 o0 V- p
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
0 K1 V4 W$ }! W }4 S6 M% M
( G) l, X2 l7 ~( y3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
. v/ I& [8 M6 X# s0 l9 I$ L- B0 c
```
8 t! {4 H% z: D, q/ a i add_action('add_meta_boxes', 'add_site_wide_notices_boxes');# k2 }6 {6 q, ?% c% [5 M
function add_site_wide_notices_boxes() {
4 ?% m; Y: N7 P. j add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');1 U) f9 Q$ e1 M. q1 r! t% j" _
}2 x+ e; `, P7 W1 e; ?
9 }& {! D0 a. q; H
function notice_details_meta_box($post) {
0 P! C" r7 o' k$ g* m, z wp_nonce_field(basename(__FILE__), 'notices_nonce');
" [ b! I" P$ J/ A( w1 i! n Q8 [ $notice_title = get_post_meta($post->ID, 'notice_title', true);
3 J8 X$ R) p( {% @9 Q8 @4 a $notice_content = get_post_meta($post->ID, 'notice_content', true);1 r. p5 Q* i8 y+ I/ T+ n2 [
?>
6 d; J) f l$ S; ?" f6 ? <p> S: f+ I: v% R* K
<label for="notice-title">Notice Title</label><br>
* v7 j/ S$ Z2 e6 x <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
- V' g7 ~" \5 ?- X' ` </p>% x( o* t( |- r
<p>
. ~" R3 v- e4 C& \ <label for="notice-content">Notice Content</label><br>
, {8 x7 Z V3 g <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?> ? {6 b1 C! X5 m% U
</p>1 N2 h* E) r2 y W# f* Y3 g
<?php
) W7 _, l( |& P: U; P4 m/ O F } S. h7 {! S6 s& S8 }
) X9 V) ]( i- v. Q1 K8 h* I' A add_action('save_post', 'save_site_wide_notice_meta_box');
- |3 e# a6 J W6 h function save_site_wide_notice_meta_box($post_id) { p a* \. l" W( t' |
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))1 T6 k0 o6 Y# o$ I( [! r+ G6 a
return;
4 f3 z( h$ z6 o9 b7 `/ C8 k0 e0 a! M if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
, _/ f9 K1 [8 ], u return;" d5 A2 Q* n4 c, b8 P
! ]. `2 Y" _& {" i
if (isset($_POST['notice_title'])) {
$ h* B/ ~, n$ j3 H update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));- J, g# m9 c7 L# |
}. g+ P% m0 r! M/ P: V. i
if (isset($_POST['notice_content'])) {
# _' G3 U8 q+ ?5 C% d2 H4 l- N- h update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));4 E6 z& y/ @4 X7 z# `5 f2 e' D
}
) b+ Z- n' a1 W: r& o& c; } }$ U7 a! q7 R8 J% a0 `
```+ v! E2 C ]5 u' J
0 ~1 C/ M# j4 w# ?' [
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。/ p6 G& i6 U, S! @! m: Z# e
& Y3 V6 t! U% P$ s) Q: |% U4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:$ k$ M$ d' _3 j$ W: [
3 g: J$ r8 L+ S5 H
```
& W( G* J3 A3 y $args = array(3 o% ^% z: B( z8 Q$ K* d# M; `$ w* b
'post_type' => 'site-wide-notices',, g: B t8 A* [
'posts_per_page' => 3,
: U) a/ \9 M1 z0 P 'order' => 'DESC',
+ P: g, M2 A- J8 N4 N* I2 @ 'orderby' => 'date'
, z% B$ ]" a5 y, @' \- j) G );8 Z* g% F/ w% P6 m. c; E
$query = new WP_Query($args);# L2 [* i# K4 w
if ($query->have_posts()) :' B2 y, A$ ^3 B0 M
while ($query->have_posts()) : $query->the_post(); ?>4 Q/ y* R# r6 G6 C$ `" t
<div class="notice">
0 F9 \( O1 k& e/ |, b9 c3 s6 d <h3><?php the_title(); ?></h3>
$ d) r/ B5 O; {" W3 ?2 a7 i" \ <div class="notice-content"><?php the_content(); ?></div>
/ R5 b, \) V) Q* M9 C </div>
; e% k0 H( M9 ?4 o4 \ <?php endwhile;- c6 g7 `7 f0 Q7 X6 `6 M
wp_reset_postdata();
8 [( _; o. D7 |$ j$ _$ P( y, p endif;
; s9 V$ z+ h% X2 g ```& r2 L0 ^$ ~7 W$ Y3 l5 o- X
4 N( I( w0 U6 g5 x5 X9 b8 r" q 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|