|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
4 O) I3 |' l3 e1 ]2 @. t; k6 L( d/ _$ q; }- n: _9 n
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
' D6 |, ?; a8 e- D6 g" H1 u: F, O% W5 X5 g2 ^
以下是创建自定义插件的步骤:
; R: W, c. _3 N3 ?8 D4 X- I# c9 X
2 |6 I; `, a+ d- }( H! ]1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:+ L8 H6 H) P8 o8 g8 a S
" F W8 L$ |9 g# I4 z1 \ ```1 G8 s9 p g% q$ H2 x
<?php# M3 K/ P! q0 {2 J
/*
! @* X. m4 \5 y0 B& F& a( Y Plugin Name: Site Wide Notices Plugin
+ i$ [( ^9 f U6 k p Description: Adds a new custom post type for site-wide notices.$ R% \5 ^+ r9 M, a: T$ G% I# E0 [
Version: 1.0" G5 y+ ?4 N3 R7 @
Author: Your Name+ e$ Z4 g9 G6 p1 a7 V5 F# f
Author URI: http://example.com5 {( \: q: a: A% P: k
*/) F* b* g. y$ {2 \4 u6 n
5 k; Q% b8 m) p# u p( E- W
// Add plugin code here...
' Y1 F2 ^) c" V2 t" G ```) ?' c+ W/ b8 \0 Q, [4 K* v Y
7 S: @" f2 a; E* n! d' K
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。0 [& D; C% C* [7 \" I3 _+ q
- L7 K% _( U8 V: o( c ^; F, v2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
! t I% i9 a/ z. G: D! \. ^ y2 ~' B# {
```. Q% X' G6 w0 Y& e
add_action('init', 'create_custom_post_type');
' ]. m0 K8 l2 Z" t function create_custom_post_type() {/ [# h, x8 x7 G8 _- i' G
$labels = array(7 ` Y6 |% X$ G7 N1 E
'name' => 'Site Wide Notices',
6 [1 i& O5 _: n- g 'singular_name' => 'Site Wide Notice',4 q9 q. c/ q/ o! h, J# f& x8 \$ j
'add_new' => 'Add New',
# N; i; y4 k( i, j, ~+ Y 'add_new_item' => 'Add New Site Wide Notice',
2 B' Q; l1 N! G" t 'edit_item' => 'Edit Site Wide Notice',9 G! ]0 ~6 `: V
'new_item' => 'New Site Wide Notice',
0 \ W- U) W2 l7 f, t( p- U9 ~ 'view_item' => 'View Site Wide Notice',* U. Z( @1 V* i. A0 M6 K4 v$ {
'search_items' => 'Search Site Wide Notices',
# i1 h; G) h8 ~. Q 'not_found' => 'No site-wide notices found'," x# W; K5 I# v# p, P( @
'not_found_in_trash' => 'No site-wide notices found in trash'8 [) B0 |1 c7 G1 [9 Q! w; J4 @
);
% c9 f! M8 S) ^4 W a: y% S) v! C! j# p
$args = array(
: {) v& y$ ^. t* @ 'labels' => $labels,* m0 E& u% N8 O
'public' => true,# g! y6 v9 C3 w3 q5 ], Y
'has_archive' => true,$ F% _, k& Q% R5 M. L& i
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),8 P( J$ l% k: w/ q/ y- e
'taxonomies' => array('category', 'post_tag'),
3 M% G4 x4 p; J _( J 'menu_icon' => 'dashicons-megaphone',% z) `' M" e" u; ^
'menu_position' => 5,
: P1 l% a. Q! D; }9 g. Q+ y 'rewrite' => array('slug' => 'site-wide-notices')2 p+ A- O# b- k a" d
);
0 G. q' p0 L- v0 ^' O* Z2 y' \! }
- ~9 R- B& O) F" t register_post_type('site-wide-notices', $args);
6 a3 p, w) v8 Q/ Z }
0 ~& Q( Y+ ]4 {2 E ```
; Q* x" u3 [6 L/ p) S6 L& T& r( r6 I6 E: ^1 D( n% _
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
: t0 k" F! S1 v0 e# q' o) d) @) i; G. T3 L+ q# B
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:4 K. y5 ^, m( ~; ` G
# Z% |# y. L2 a ```
/ r# Y7 F2 P0 P( |1 Y( F! J! M add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
- r3 X) \* P q( Z function add_site_wide_notices_boxes() {! m4 @1 z _4 N/ a+ n$ \
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
& L1 f/ T3 Z+ [5 f }
; l, f% l1 l3 \8 T* p# c, H) U5 m7 M8 f0 E R& Z" {( D; M
function notice_details_meta_box($post) {4 C9 W' |- s( F$ Z& h& ?
wp_nonce_field(basename(__FILE__), 'notices_nonce');$ F; Q* O: s( v! B
$notice_title = get_post_meta($post->ID, 'notice_title', true);
- H% N/ ?3 ^4 K! }2 ~ $notice_content = get_post_meta($post->ID, 'notice_content', true);. C6 [ l9 l( c/ U. |
?>
1 @: w( {( K1 D+ I7 |+ L! ~ <p>! d4 N6 o+ R' K" T7 i l5 {
<label for="notice-title">Notice Title</label><br>
6 m& f. `+ V% ]4 U# H, b <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>"> l" Q3 Z1 X' {- h |
</p>4 M8 } C0 L7 k, g0 q) n4 r
<p>
# z$ y; q2 J+ ?4 @ <label for="notice-content">Notice Content</label><br>
7 `9 p7 y1 E& f9 A7 S4 u <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
F F( I9 l- J; b </p>
% F* O9 B* B% U. V) ~* ]( R2 W <?php
, X# K: E- m* t0 e* J+ ^4 F- V }
$ U& O+ D" g5 U9 z
# i5 L- W7 F" ^' \# ] add_action('save_post', 'save_site_wide_notice_meta_box');- M4 Z" J: ]6 D. Y" [: t
function save_site_wide_notice_meta_box($post_id) {
9 V# c2 A2 {+ \ if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
! O2 A% g9 e$ R9 K: i# [- K V8 C' _ return;
1 p4 o3 N: B4 f5 V if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)7 r. B" ~* [1 A' k+ ^3 h; Y3 {. l8 X
return;" o+ i2 g/ U! s. _+ z
* t$ B, e6 h9 C, a if (isset($_POST['notice_title'])) {
# q w& Z) k" ?8 L6 F6 B update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
9 L: W; t" H+ @# Q3 S }
Y. _$ S4 U9 L* R) e% ] if (isset($_POST['notice_content'])) {
5 E& a+ G1 ]7 n" M update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));: t7 `" ?4 P ?# _( a
}
6 H4 x: m2 K2 R }. H# D2 K( ~- \, {3 t9 c* Z% p
```
r3 d$ D5 e9 d) G
9 s8 }5 f- B! F1 b' E3 W& M 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。6 c) Y( y% Y9 ~/ _) z
# ]* d8 P" X2 ?+ G4 q+ F) @
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:# F* g8 |; n" t' ?
1 a. O! L0 c9 O; C' Q' @ ```
# z* R1 I# y& R8 r9 k" [! i- H $args = array($ `; ]8 c0 }4 T/ V( j$ F x
'post_type' => 'site-wide-notices',
& m$ ?7 t5 g0 X 'posts_per_page' => 3,
5 [( D2 Y1 K) C' m* n 'order' => 'DESC',
, V% T* c2 c1 U! z 'orderby' => 'date'
, A# P! Q/ b; \ );
! D/ I( g& g6 T $query = new WP_Query($args);
* V. V, e! y& x6 v, G6 U if ($query->have_posts()) :. H, d) B+ V- P% E! ^8 u1 W! X
while ($query->have_posts()) : $query->the_post(); ?>1 _" ]4 t$ X# a$ f1 x' j% Y) f
<div class="notice">
* l6 h ~3 J5 I- U* T* i <h3><?php the_title(); ?></h3>1 w" ~2 o \/ D$ ]( A
<div class="notice-content"><?php the_content(); ?></div>3 d+ k0 a( }! A+ U; ?, P
</div>
2 I4 j4 u/ s& M4 Q: ^: J2 u' V <?php endwhile;4 B9 a2 @! A# @- i+ U
wp_reset_postdata();6 r7 e( [0 A* t& ?4 m3 H
endif;) z6 ?3 F# u- i* c) c% k
```7 k% ~& Y$ X6 x2 o
: f& `3 F: z6 f+ F* K: i$ R, P
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|