|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
' `/ ?/ r1 T7 n$ o$ s" N
% G0 s8 q$ W% T- D [6 B: Y9 G& C. O如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。& H) I& r/ e) k" n( O
. [/ P3 q/ A" z7 @, Q4 J! a& y以下是创建自定义插件的步骤:
0 m1 {( E+ S6 h0 M" y1 Q" D& P" ~$ X& [3 {6 |9 g
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
6 a4 y Z' A- C9 ^! p( @) ]9 Y4 `& ?
```
7 ?6 D; A! {6 _( y S9 ~ <?php2 K! i* o4 P6 u: v7 R/ S8 }
/*
! p6 x0 f7 T+ L) ^- {# s$ a( c Plugin Name: Site Wide Notices Plugin
* n: ]0 v: K4 O5 p Description: Adds a new custom post type for site-wide notices.7 m/ \( v) J# [6 |; a4 T& x0 J {
Version: 1.0
\. m" J% h' r* R" u Author: Your Name
6 N5 P- w3 j3 x1 ^% Z. y Author URI: http://example.com8 V" O5 J) v3 L
*/7 @) U& W8 E! n6 r. B
2 a: U0 g2 q6 o! K; [: S9 b // Add plugin code here...
7 S) u2 U! ^: X' B$ i9 x: u ```9 Z6 s C9 H. n ~
3 x8 D9 Q+ E4 f6 ]
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。# Y( k. B* A0 y
0 t+ e7 ^! w: m: O' c
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:- |1 d3 r# H: j8 q
+ `) v9 D- ?; f( Y, s
```
+ ?" A8 r( Y4 m' k add_action('init', 'create_custom_post_type');
' B1 t% `; [0 f" @ function create_custom_post_type() {0 t$ Z, V6 Y% |" W
$labels = array(: R, X6 v1 q; n; {) F3 c5 L
'name' => 'Site Wide Notices', z7 p; u, {1 o% O! g- e
'singular_name' => 'Site Wide Notice',0 t1 F+ T" J& }$ m0 Z
'add_new' => 'Add New',: }# r, _9 E8 z
'add_new_item' => 'Add New Site Wide Notice',0 Q n8 Y. H8 U- r( r; ]
'edit_item' => 'Edit Site Wide Notice',# @8 J( [! E- w8 I
'new_item' => 'New Site Wide Notice',
+ Q8 v* s. _# J) e8 w5 H" p+ _ 'view_item' => 'View Site Wide Notice',3 t) ? G% d5 a
'search_items' => 'Search Site Wide Notices',, F7 E! P# |0 w7 f, t# h
'not_found' => 'No site-wide notices found',+ C/ a8 y+ c+ `
'not_found_in_trash' => 'No site-wide notices found in trash'
3 M) s; J: q' P# r );+ L9 Q/ e4 J6 U
$ B9 C. Y t1 Y6 Z
$args = array(- P- A I- a0 g+ l, x5 w
'labels' => $labels,
" \2 w+ k# c+ x) J8 ]. I) e, { 'public' => true,
* h! n$ x6 o7 ]2 | 'has_archive' => true,
' q* V8 y* n. ^, ~ 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
+ r) c$ E: @; t2 J c% l- E 'taxonomies' => array('category', 'post_tag'),
" I6 \; z. C+ x1 l, F1 k7 e 'menu_icon' => 'dashicons-megaphone',! k: q: V! v% v* n7 C7 u; }
'menu_position' => 5,& M. S8 h5 C9 q2 s% j' s
'rewrite' => array('slug' => 'site-wide-notices')" \9 Q2 ]9 d% o; K8 o7 d
);
9 _; k) [' ?2 y2 f
- B( o- m9 q. } A2 x* q' h. J! h register_post_type('site-wide-notices', $args);1 t9 {' k3 G2 G7 e9 l; K* {9 G& ~# S3 j$ @
}
: W. _+ d3 q/ S$ X6 v: w ```
% e; o5 P! O6 F5 F8 N/ W
9 o' P) y! ~, Y { 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。: J3 P* c, y. m1 u, w/ n; g# @
0 T- a9 L% Z& z4 c. S" v3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
9 D* d! i5 F$ q B( _2 H7 B) W8 A% S( f& A; V
```7 x0 ~3 D% g J$ k# B
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');3 W8 W: M7 w# u3 q# Q
function add_site_wide_notices_boxes() {
( v' w9 F x+ s6 r3 I, B% N8 n add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');+ n5 w3 w' G: S& L, d4 E0 q
}
X, f6 ^0 }& C4 [- @6 p; c+ ]
. }" {- [% q- O! z6 m2 c function notice_details_meta_box($post) {
7 I; f8 ]( z3 m: z }% x wp_nonce_field(basename(__FILE__), 'notices_nonce');
$ ^: a7 k4 g' Y( _6 n! r $notice_title = get_post_meta($post->ID, 'notice_title', true);4 E T* p/ c S" J3 Q+ u3 Y1 y) D
$notice_content = get_post_meta($post->ID, 'notice_content', true);. R6 e3 l4 U+ B* x/ X
?>1 f( ^4 m0 ^* u0 k6 T
<p>
4 A5 V' K) i4 R3 X) m <label for="notice-title">Notice Title</label><br>1 A: W' n, C* w# ^) T3 W
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
& T! Z6 h& T9 w% e$ v. U" v) {& A </p>9 q6 d4 D4 A" o" q$ Z* O% b
<p>
+ z# t9 j+ e- v) _* m <label for="notice-content">Notice Content</label><br>! R# T2 f4 A" R( y7 z3 H
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
, S# C" x1 \: L4 i7 ^4 d. d </p>* M5 b2 m2 o/ p9 v8 U' [9 S
<?php6 k0 j ~) o, X9 w6 v0 p
}
) P7 j _2 p4 m/ x, H! s
/ [# g9 W# I# v add_action('save_post', 'save_site_wide_notice_meta_box');
" c4 v% s) i% {, K$ u function save_site_wide_notice_meta_box($post_id) {
2 ^& c5 k$ ]0 m3 f if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
8 Y. A- Y' c5 y; ]2 H, [' ~7 I$ Y) U return;
1 H9 H& ]* m( X0 I! ]- J: z if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
0 R! X* F Z- h* |' e( |( m. B- ` g$ _ return;1 W) O+ h: X' C+ u
" K, C9 G1 R1 t: Y3 y h0 t if (isset($_POST['notice_title'])) {
+ H; ^7 b% f9 G' B" V update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));% Y) l/ s+ l& d! K% D
}' M" H6 n( o5 m$ v0 y5 u, [
if (isset($_POST['notice_content'])) {
c, E g2 {5 p9 q3 C update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
6 ?9 U# n0 {2 n+ ? }
4 n3 M8 N% q8 |9 q" s }
8 ~, d1 {3 o5 k" \ ```. m+ O$ x% b5 V1 \- e
) }1 `, z9 O" ?9 O2 R
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
5 J/ o. Z! \: m8 [; U
2 B$ \: y. ~& ]; X8 r4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:8 v- m# ~8 s* X! c( `+ o
( u/ E7 H) P$ @$ m
```
5 @4 L$ i3 W! O5 n/ l0 X $args = array(- V! u, U& _3 U* S; a
'post_type' => 'site-wide-notices',
$ i, T. i3 S3 i2 u1 m' ?- Y+ Z 'posts_per_page' => 3,$ d$ G# G- o/ B. c& z
'order' => 'DESC',
; [! G; T: \* e; ?, `: s) A 'orderby' => 'date'9 G' c" Z8 c8 T2 R
);5 f/ i7 _9 K# ]5 b1 r7 L
$query = new WP_Query($args);) Q4 {/ d: _$ u. x
if ($query->have_posts()) :
9 ^5 n; J+ F/ _1 X: y" C while ($query->have_posts()) : $query->the_post(); ?>/ }+ U7 S# W( W- E7 D
<div class="notice">
" b: j y2 u D6 s& P6 U <h3><?php the_title(); ?></h3>3 ]& c9 p: J7 U; z- m1 ~" L# K
<div class="notice-content"><?php the_content(); ?></div>
9 S7 U* h. a/ O% F* e9 G% d, z </div>" l* S! { m; g/ q1 D; u& h0 Y
<?php endwhile;
: {/ ]% r \9 e& \* x: L wp_reset_postdata();
% L8 t( o& `, f. F5 i" V- z endif;
% |2 n1 b9 w; n, d/ t! H ```
' j2 k% D1 N5 A' m) p8 s1 g
. p+ f3 Z' _: }+ x 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|