|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?5 z0 N, I* S3 h) N8 `
. _0 v+ ~( R$ \* q/ u: [) ]
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。: G6 _; O) V, q
" A* D' |+ z- l以下是创建自定义插件的步骤:# c1 T0 N8 P6 [: ~ p/ P
# x/ T0 u5 ^4 _" [1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如: k( l: `4 U( I {1 V
0 A& R3 W, ?! V# l7 D
```8 e. F$ L" h% n' W2 V7 o- R
<?php
2 ^$ ~6 [, b% [! |/ J$ u3 Z( O- y /*. X: z: S1 K4 R& _ L$ S
Plugin Name: Site Wide Notices Plugin
: G. ~: P5 Y& G9 u Description: Adds a new custom post type for site-wide notices.
' g6 B) p9 E g/ f$ d Version: 1.0
$ F7 `9 c8 G, h/ h Author: Your Name# k" ^+ N0 V* B0 |5 G
Author URI: http://example.com3 ?; O8 h( f6 j4 h
*/
& X: D9 z- T) s9 Q4 f4 @7 G
% E4 b( B( y5 p. K/ k // Add plugin code here...1 M3 U1 s/ T, h; K4 S/ {- g0 c
```
5 C! f' R+ C8 z& `
5 z0 b. g( u, q: f; G 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。" y- B. U: `2 ?6 N
: q5 _1 v9 d' d! |: N7 Z2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:3 l4 |( i' s. \, y6 `" ?
1 Z8 K% \1 V6 M/ U
```1 h7 \0 Y* ^. k2 L1 g' f
add_action('init', 'create_custom_post_type');
D5 l/ N* a. X9 A function create_custom_post_type() {
+ \3 ]" h0 Q5 s, _ $labels = array(
) r) d2 n9 D+ I; U8 W: ]5 i: C8 r8 r3 ` 'name' => 'Site Wide Notices',$ S. i9 ]* @: q y E
'singular_name' => 'Site Wide Notice',: ^8 c% h' M/ d$ I2 l7 A3 `
'add_new' => 'Add New',
9 V( `, h; _9 E5 A6 D, x 'add_new_item' => 'Add New Site Wide Notice',
6 N0 E: \5 Q* C6 W 'edit_item' => 'Edit Site Wide Notice',* F+ P8 s$ G0 u; ~: |' N
'new_item' => 'New Site Wide Notice',
/ X* I! l0 X% U( r, R 'view_item' => 'View Site Wide Notice',/ y3 J0 O, f* b' m$ r" Q! p
'search_items' => 'Search Site Wide Notices',; V8 O1 w6 Y4 ?
'not_found' => 'No site-wide notices found',
. j$ T* ^9 B. ?- W/ c, l 'not_found_in_trash' => 'No site-wide notices found in trash'5 p7 ~1 L7 z2 J$ l
);0 e/ [- N4 c" S# M
+ }% m5 A6 V0 Q6 C$ X& U: d1 n
$args = array(
' q, K5 C; c, w2 z9 O* a 'labels' => $labels,' U( H; e# @# k- W
'public' => true,
1 W8 @& m# ?* w: e 'has_archive' => true,& q" U! Y7 k8 [4 I, W
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions')," w; ^+ J4 }5 {" j- O$ J
'taxonomies' => array('category', 'post_tag'),
' n8 k3 {: |, H1 F" d 'menu_icon' => 'dashicons-megaphone',
! i! l' f7 `" m6 ]' e: v8 q. T 'menu_position' => 5,
- M' |; S% z9 J1 A f 'rewrite' => array('slug' => 'site-wide-notices')6 L$ Q" S% x7 t3 B; v# |
);# P0 \' t% N+ J7 N
- a8 V: k9 G+ M# r0 y% y* Z6 W) {" G" `
register_post_type('site-wide-notices', $args);. p6 } \4 z' }6 L+ s. T; D$ S
}
7 q5 Z0 z/ d r v% D ```
; @3 u7 ^+ ^! i; s7 x
6 ^& _, W! E0 L, b N5 A2 E* x 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
5 f4 `. }. N$ ^( V5 M
6 l, f2 u3 n% X- v. C$ X3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:3 U6 I; [. N8 b- D4 u) O- h
! J- J w& N% w$ P2 q6 z. a% [ ```% B6 ^6 g+ x' ]8 {0 [
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');: `( ]1 I) u, {8 r. j
function add_site_wide_notices_boxes() {% d0 b! w8 |& X2 i" F$ V4 H8 L. l
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
) u/ ^1 w: `2 q( D }9 l' I6 l! H5 l8 W1 s0 [
- J5 j, q. d( o) Z function notice_details_meta_box($post) {! ^, T) k4 G m, G# `
wp_nonce_field(basename(__FILE__), 'notices_nonce');
: `+ `6 k- K, _ $notice_title = get_post_meta($post->ID, 'notice_title', true);$ @4 s2 b4 v0 X# X& ^. E9 ~3 e" ?
$notice_content = get_post_meta($post->ID, 'notice_content', true);* x. U6 z; L% X9 R( V/ l
?>% K9 P; ` M$ G3 v0 H- o
<p>" f6 z* c" C6 _1 Q: n
<label for="notice-title">Notice Title</label><br>
) U1 Y# b5 X* ^, g <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">) H1 y) ^3 u" ^, t- e/ h3 Q8 B B
</p>
/ w3 t+ m A8 s/ z) t <p>
/ G" C( J8 Y6 M% i: [0 J# G3 n <label for="notice-content">Notice Content</label><br>
' n$ w8 B. c9 x, M; P& r) ?8 s* L <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
9 J0 K3 n1 ?: e0 r3 V </p>
4 g2 b8 m. A9 n! q <?php+ y' W# }! J! w' k, P
}
* E! e4 j" q" G R# A( I. g) Q: F5 ]$ d" K2 [
add_action('save_post', 'save_site_wide_notice_meta_box');2 j% D, @' }3 t9 B
function save_site_wide_notice_meta_box($post_id) {: `+ h" p6 r, s3 H0 T- ?7 Q
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
& Z' l W. ?3 v; K% p" Q return;
. g$ T; a( @% }0 w9 k if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)% ]. Y' w! p4 {: e$ l3 u/ D: q, j0 e
return;7 B4 o4 I$ |, n- [7 k- v
; S" }" H- F# K3 F) H4 `7 ^
if (isset($_POST['notice_title'])) {
. a3 t+ }6 F- t& M$ l$ {! r/ a" U3 U update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
# ]' J7 C, I5 z$ {- } }
# C" @) t' d+ F7 r; I2 c# j if (isset($_POST['notice_content'])) {" l4 O( ~( L& f/ ~$ p! j
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));4 f3 {5 o$ ~5 D$ N2 L6 I
}: ]* U- g ^, W+ w e3 L* T
}7 f: K1 X/ v# D1 m' C
``` u2 A3 U; W5 @- B$ D/ J4 ^, x& L
. V- @6 V- u5 N 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。, a+ L" j! ~9 T% C t
& ^' v. m; n# k! v+ q
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
) o$ ~( e c7 J$ J/ u% H4 r1 ~4 z6 E: n9 T1 W# E$ Y% J
```: i4 _# ?( S* f' A6 k, T( B
$args = array(
/ u1 X# r% ]5 A1 {7 i) ^ 'post_type' => 'site-wide-notices',
6 `5 x2 O: I# P% t1 b% h2 M6 W 'posts_per_page' => 3,
* H, _/ d" O; w, H. \& ?+ e* Q 'order' => 'DESC',
/ t$ `5 U) [8 u" N \ 'orderby' => 'date'
8 r$ v. C4 f0 m( |( v& D$ F );
& N2 |8 n0 W% t; g" y7 r $query = new WP_Query($args);: K, x# }8 n4 q, s$ ]2 x+ n
if ($query->have_posts()) :2 z4 W7 c8 c) p1 j; E) r
while ($query->have_posts()) : $query->the_post(); ?>% O6 g$ {% `1 x6 M) g
<div class="notice">/ Z- x; ?! W" P: {/ i7 v0 ]
<h3><?php the_title(); ?></h3> Z; @8 {' @' O+ _8 [ t; C
<div class="notice-content"><?php the_content(); ?></div>
) o8 p% ]) C/ _ </div>
! V: z1 S3 T& m* X) K <?php endwhile;2 w2 C4 t+ X) @% S9 D
wp_reset_postdata();; v+ _5 ^& c- N I% o' _% X
endif;
- P1 m) _6 {6 a1 U" I ```
, x- e) [1 Y/ f+ s
5 H- c9 W+ w- a. ?3 x& l8 G* E 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|