|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?( C" M r8 y$ p6 I V6 Q
% x: V6 C. D9 a6 P, q) o如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。. M1 t N F/ D
0 G- M4 N) M6 _% E3 l0 ^以下是创建自定义插件的步骤:
; Q$ l8 j1 u9 h$ l" W, d
( ?% y/ t# b; s. A$ `9 s1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
" o6 n( f+ `& r5 ]4 ~; O0 Q
$ P5 P' I0 S* a ```
2 }* X7 ~9 z' z9 S* a4 Z <?php
4 N0 g. ]- h" N /*0 @3 Y6 z' Q* c
Plugin Name: Site Wide Notices Plugin o4 O! N8 s+ s% m/ M
Description: Adds a new custom post type for site-wide notices.
) v1 E. q2 f' Y T9 g Version: 1.0
" s( ~3 B6 H; _3 |2 e( q% h- |- i Author: Your Name) v$ m7 y. _* x6 g
Author URI: http://example.com' J. v, T7 }1 s3 S% c; D( j% L9 W+ F
*/
/ Z6 u2 p! a+ i& D- q! r
8 G9 {' N+ Y+ v0 ? // Add plugin code here...
' S6 U; z) [7 d6 P: x# A. f ```& J( F8 m+ m7 {, A% U2 d# Y9 I
4 u$ m9 R: g( ^8 ? 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
' a- W9 T- s$ C) f& \3 Y( b' \' `9 z7 Z# u/ ^3 w6 T
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:/ h- |+ I1 \; \2 S5 U9 t" a- t& `! h
" q! }. f( u! s% h" V; c
```% x6 \( t* t- L
add_action('init', 'create_custom_post_type');
$ l7 [ c6 ^+ C% w% W* I% Y' m function create_custom_post_type() {
& S `7 l# @9 P+ i: X. ` o $labels = array(0 U$ {' ~, M; Q
'name' => 'Site Wide Notices',
2 d2 w' z7 E1 E' \, `4 p5 W 'singular_name' => 'Site Wide Notice', |- V) s% B0 ^) ?7 ?( I
'add_new' => 'Add New',
1 w' u/ ~/ v2 X* E 'add_new_item' => 'Add New Site Wide Notice',
8 ~7 L6 U7 F! E1 B) J 'edit_item' => 'Edit Site Wide Notice',
3 M$ {: @1 O3 A$ H# {, T! Z 'new_item' => 'New Site Wide Notice',
d. G7 \, f& W* t$ X" |/ f 'view_item' => 'View Site Wide Notice',# Z. x9 q3 J$ F
'search_items' => 'Search Site Wide Notices',( C% O5 W5 [- |
'not_found' => 'No site-wide notices found',
4 k, m, i# c, b3 h/ O+ |' {8 ` 'not_found_in_trash' => 'No site-wide notices found in trash'
" I h: V' f+ O& p2 D& W );
$ D* V. N |) f6 G; c4 y Q; a8 y9 j8 F3 _" K; s7 R6 ~
$args = array(
+ j3 I# Z5 P4 y 'labels' => $labels,
2 f% i2 G9 R: |) H9 _) V' d 'public' => true,
: r" C, ]' g/ o' P: W2 u 'has_archive' => true,
' b* ^& m4 D/ ^4 T 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),1 A) W6 d1 c# @2 k: Q
'taxonomies' => array('category', 'post_tag'),0 Z. [9 ~- u" D7 e! e' j# P9 C
'menu_icon' => 'dashicons-megaphone',$ M# b, b, l9 _# D( a" T
'menu_position' => 5,
4 j/ e4 r( ~2 |7 |4 |8 Z/ G 'rewrite' => array('slug' => 'site-wide-notices')
% X4 P! O& ]& ?" n: i );' p, F$ B7 q8 M2 c
6 ]. X( k# f. W+ J4 B* m/ b
register_post_type('site-wide-notices', $args);
7 @0 n" U z" {+ N( _4 t1 ] }, Z" B! ]) y: j
```
a r, \! _* |5 r1 y4 X* X' B
: |7 x) g2 E7 H" g4 T 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
! g$ U7 o" t/ G6 v' T! n
) Y: |0 A: M3 N/ C: q8 `5 A3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
* A6 f+ X" V g2 }3 X( |; H' T& k1 ~- L) I9 [4 x
```
- b, i% X$ K v. r add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
( ~. e8 ` ~; |" u* c function add_site_wide_notices_boxes() {
# M+ Q) m, y# I! n4 H3 |1 x+ e9 l add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');2 h& G" R/ @* h: y/ Z$ t
}
! z( k' e2 t- r! h4 T. i) D( |
! A- c' d1 v4 P9 A function notice_details_meta_box($post) {
" X+ T( l/ d5 `7 s6 ]* m wp_nonce_field(basename(__FILE__), 'notices_nonce');% s0 o5 R" B4 z9 ~
$notice_title = get_post_meta($post->ID, 'notice_title', true);
- \+ ], G' k+ U9 f $notice_content = get_post_meta($post->ID, 'notice_content', true);8 O; y7 p$ u3 i" E4 Q1 X) K! F3 d7 _- B
?>
; U" y: _, {. n. q* l7 a8 t- @ <p>4 ^2 ]: x1 v- j! [" P0 e
<label for="notice-title">Notice Title</label><br>
5 f5 b- E# E" u5 d4 I* I% q. S <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">6 i- ~; Y6 x/ a l' B9 k* u+ J% V
</p>
$ L' `& Q( @# K0 P, x( q <p># F5 Z* Y" A# Z/ p" _( I- d9 g9 B7 W
<label for="notice-content">Notice Content</label><br>
/ k. y7 V, v- t* Z3 l. D1 W8 f8 s <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
2 R& H" n4 r, r& | </p>1 E+ R+ ~5 I- R3 p" j6 n, S+ M/ o
<?php
* E2 m. G1 I A0 |4 K1 j. Y Q6 L% D }
! E7 W3 M4 L9 o" W$ o9 n7 V1 e$ q0 q# V" ?$ I/ p% H" L
add_action('save_post', 'save_site_wide_notice_meta_box');
6 r+ D8 v( u# ]: Y3 o function save_site_wide_notice_meta_box($post_id) {/ K& e1 b- q4 A& F2 n0 p- W
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
7 G' h) h; {9 I* | return;+ H5 v; m x6 x: f; R
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE), k: s4 O5 [9 r
return;
6 c4 O$ x# {7 i
0 }. f6 |8 K) }- U* c* J7 j7 X if (isset($_POST['notice_title'])) {
# z2 ^8 ?& m- Q! [9 `* a update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));$ D0 Q7 C( i" i _6 X% l8 L
}
* v9 Z/ x% V! L0 U9 J% U5 D; r if (isset($_POST['notice_content'])) {
. l3 ]0 n d6 y7 N# \ update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));; V, L7 \% |, x2 x' m
}
6 r4 ?5 o1 K, f: S0 r! Y, q: Y" @ }
# C7 u3 @. O5 o) N1 c6 W ```" T5 n5 d! z# ]. L" Z# `
1 }4 S! x. F2 s
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。/ F* W! ` L$ J9 m
1 e; C" J+ ^0 |; a6 m3 @3 a6 p2 \
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:5 Q \% R% l3 \1 v' H
1 m6 f4 p/ S) S) y H7 E ```" W* F R! n7 O/ S' @: `( @9 S
$args = array(
) I9 _" g7 N0 l 'post_type' => 'site-wide-notices',
) J% B% \4 C2 v 'posts_per_page' => 3,
, v! ~' y2 i. S2 e( E% N 'order' => 'DESC',
+ r5 @$ H" N3 U! m4 _! L$ Y$ v 'orderby' => 'date'7 f; n5 ?4 S. J+ m% u
);
% O: Z! m* C. } $query = new WP_Query($args);
, [2 K0 E8 W2 \; K if ($query->have_posts()) :
# ~! O* M$ ?4 M1 `, h4 H E5 v while ($query->have_posts()) : $query->the_post(); ?>% t( ?% N% N$ D; A, o! x: o3 Q
<div class="notice">
/ p0 [6 _& v; N6 j8 W" Y# @. k <h3><?php the_title(); ?></h3>
1 S, E" H& n) \ <div class="notice-content"><?php the_content(); ?></div>6 s+ l& a2 J! L: E9 f
</div>
" l1 e+ _: K, J9 @0 p( j+ H# D <?php endwhile;
, p* @. H4 p0 O& m8 d/ |5 y5 H wp_reset_postdata();, I6 J, Y& ~. L2 o7 u
endif;
$ {! N, N- ]* K% ]2 Z ```
( R, a7 T( X; i/ n
9 n+ [0 V1 `/ S; {% W: \ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|