|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
" L( A% `% `& W4 u6 T; h
8 T( z% U+ G( V# n+ G3 K2 c; O+ b如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
" |. K a1 @" q4 Q
! g% e9 [' D0 s9 D8 S/ Z8 p% H, X' e以下是创建自定义插件的步骤:" x3 |6 V2 n7 _9 b: r1 P/ _7 k# R
. H8 c) E& x- M M6 p7 P1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:* {. a, U- F' j. h( F5 x. u
. ^; f5 z2 G0 y4 j
```
" c1 `$ q7 M& w. W8 z <?php
- \; j) {" g+ _4 p. ]# I5 f+ B /*
6 S4 T1 w: _. w+ [' @# q& k Plugin Name: Site Wide Notices Plugin
; l3 }# H/ B0 q$ f Description: Adds a new custom post type for site-wide notices.( `9 w5 q) W; l/ u* b& W2 S7 o
Version: 1.0
! X; T$ h5 Y7 l' ] Author: Your Name% w3 Z N6 p7 Y
Author URI: http://example.com
# ?' I# \: x% O- {# J% q */
- o2 e: @( l" W. \' u: X6 ]* F
# ?5 U5 _0 ]6 Q2 L // Add plugin code here...
& z4 U3 W* W8 B# k" f) _1 W2 q: P ```
! J; D @% g9 Z* A3 y# d k4 O( ~* K
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
3 D u/ x1 r9 n
8 k% z$ z! Q/ N2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
6 o; W0 [, i9 Y
% j6 t& R' \: p# s ```
3 D2 |# n" p: z" |: ^+ p# n) ~& \ add_action('init', 'create_custom_post_type');
2 [/ S" l& S! y! w function create_custom_post_type() {, H- m9 E5 F! V) M0 J9 r7 b
$labels = array(
9 F* H P) v s1 h/ R 'name' => 'Site Wide Notices',; k1 l4 ]6 }& T" G6 S S% C
'singular_name' => 'Site Wide Notice',
- T) O# N9 M7 f7 w1 ~' m& ~ 'add_new' => 'Add New',
% E+ _; ^' e! K 'add_new_item' => 'Add New Site Wide Notice',) m7 G$ a6 k( R4 h7 c7 R" b7 |
'edit_item' => 'Edit Site Wide Notice',
; i! X1 u9 d9 A3 { 'new_item' => 'New Site Wide Notice',
4 \7 [1 _7 H0 j- z$ z( s+ o; g' w 'view_item' => 'View Site Wide Notice',2 e j; `# s' P
'search_items' => 'Search Site Wide Notices',( y# l+ H6 Q2 F0 t& O) M
'not_found' => 'No site-wide notices found',
1 y7 u( ~. e) F5 P$ e8 K8 W, M 'not_found_in_trash' => 'No site-wide notices found in trash'
/ x) @" R" Y) A/ D5 c+ o8 A- }6 r3 a );
' p! d6 b4 j0 P4 z$ Q; g% K5 W) W: ~) _) D1 u& B4 b+ c$ `
$args = array(
7 f9 I5 l5 R6 p" w 'labels' => $labels,+ D4 A, f5 k6 \& F
'public' => true,8 v3 g P0 \& I0 p* [" A
'has_archive' => true,* N! a) O( _# D: x. L
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),% N2 o' N/ z* W+ Q9 j+ B
'taxonomies' => array('category', 'post_tag'),
3 r8 E% o) |- N8 L E; K2 X. A$ d 'menu_icon' => 'dashicons-megaphone',
( b. ]5 M- ?/ Z) t 'menu_position' => 5,. N' K0 h0 c0 ?3 I4 w
'rewrite' => array('slug' => 'site-wide-notices')" }, ?+ j# u/ ~ O ^# o
);
! `0 a% `- a C# P
; j0 L1 [0 U o! f1 q, I4 F6 s register_post_type('site-wide-notices', $args);
3 i; |2 O+ L) {! e; L$ j5 y6 A }
; }0 x' }, r+ Q: c- I- R ```
; f% [8 ~( ^! m! E! x+ V- e6 m5 C5 ]9 v3 X4 l8 ?2 j1 w4 }# u
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。; Y9 f" c) i" b
9 [/ w# v- l4 {/ ?: ?3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
4 l* x/ v5 ~+ y8 x6 `3 U* s: {" T3 u' e( |9 `% O" N
```" J' W. X8 u& F3 K' y, P
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');4 M( ~4 ^( [# E; R K4 ]7 H+ R: U
function add_site_wide_notices_boxes() {) T" l) s4 F5 N) t" d Z
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');' ?( Z" u( `( l3 G' x
}
# c3 y/ c/ H' S2 ~* r* u7 {" ^! \ M7 _3 g. C: ?7 c2 x, r
function notice_details_meta_box($post) {0 u2 u. `9 N. A, J, T; T
wp_nonce_field(basename(__FILE__), 'notices_nonce');
" x( M& x, K6 g) X, n( N $notice_title = get_post_meta($post->ID, 'notice_title', true);
7 e; _9 u" P% [ $notice_content = get_post_meta($post->ID, 'notice_content', true);
: t5 ~! x/ O2 A) I4 H: W ?>- D( ?9 u5 E1 v* I' {% }8 @" h1 J# O
<p>
2 C; j$ K. ~& F% ~/ t2 [ <label for="notice-title">Notice Title</label><br>
1 K* s' a6 f! a- x3 K1 w) \ <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
0 N1 ^& {; m2 B4 b* t# s Y$ i </p>5 b+ \! N9 h' J
<p>
L& G, ^3 T7 @1 J, T" S <label for="notice-content">Notice Content</label><br>. F, A7 |* o5 [$ A, @1 ^8 A& J
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>8 Y+ _/ l1 L9 A; f2 G' k1 |( e( W
</p>7 \2 I" \6 U6 c' J$ s
<?php
' ?3 ?" L2 F* F, [ }# t3 [% C2 b8 B8 l) w6 q. z1 C
9 u- N# m `* l# J add_action('save_post', 'save_site_wide_notice_meta_box');: G2 W, L* s/ q$ u
function save_site_wide_notice_meta_box($post_id) {
4 B9 |; P" @, @8 R: l/ J" v8 L: h6 E if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
5 |0 `8 e, Y/ F% R9 E& a( h return;. a/ X% t, D! ]/ A
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)7 e/ f4 k7 z+ C- _% x
return;, R( k( y7 ^9 U! I7 [! `
( P: [1 G! Q& ]' |$ r- D
if (isset($_POST['notice_title'])) {! b4 K. Y3 c# E" G, B! J/ ?3 U
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
) h) z0 t+ L4 o' N4 j! b: A }
) c* I( ^% f* E R9 I9 e if (isset($_POST['notice_content'])) {! {% i, ]. V( q+ n* e
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
; m+ ~$ P' K2 B r- w }
$ q& w4 f8 ?: Z, m! X: o }
: A, {" V7 V2 a3 W. t% Q ```
$ h" y/ v. i# I0 {
8 o# X) F9 k U7 o 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
, {" D: j) @0 p
, j% [" H! C' d) i/ K8 C4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
! O/ k) D+ K0 E% S' J! w5 t4 Y D1 C3 ~0 f4 p
```
# f2 f: `, d) Q $args = array(
# y7 Z* E/ `, w& W 'post_type' => 'site-wide-notices',
$ i* r @% i4 M, G. j: i 'posts_per_page' => 3,
- `; l" P9 }* ^6 v5 a 'order' => 'DESC',9 R0 [7 T: I6 h m
'orderby' => 'date'+ O- N0 S! K5 M- k) C
);
- W1 ^0 ?! R2 [8 U0 I: R# c $query = new WP_Query($args);
/ U) K+ K6 H+ |& I2 f if ($query->have_posts()) :/ c9 |) ~) N! y& G
while ($query->have_posts()) : $query->the_post(); ?>
6 [0 M% Z i5 ]4 \: k7 X <div class="notice">" L' l b6 s, w8 b3 {: X/ d
<h3><?php the_title(); ?></h3>3 A9 d7 y4 z: f
<div class="notice-content"><?php the_content(); ?></div>8 n0 c* k" \4 N- d- k* S9 h- j5 g* t
</div>
' u' x5 J9 |' c" n6 d <?php endwhile;0 B8 g3 b4 r4 C D
wp_reset_postdata();
, ?1 ^' O. h; C ?' W! q3 d2 l0 o W% r endif;
- d, v) H6 a6 ]) m+ f" G5 G6 H ```
9 y; }( `4 K6 u' b+ b
@/ P& R+ v- G5 K. j 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|