|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?, s$ r3 K+ Q5 V/ k" x' ?
+ e4 W) C7 _; B, r$ T
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
+ O- |0 p- h+ a. }. H8 _+ b: u) k4 t
2 ^8 f2 c* s- x4 ^" Z以下是创建自定义插件的步骤:
% x* ]+ O! Z, r, A* [5 p, k2 Q& Y3 @7 _, ^& `, E
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
7 c* ?$ i# m2 O
. D' l8 ~/ j+ S0 e; T" p# _ ```/ u1 f3 \& ?& `8 n+ M( K3 ^' v6 r
<?php' }$ z" j6 K0 Y
/*
0 X! d( i- @ u! [6 Z Plugin Name: Site Wide Notices Plugin
7 N3 z: \: @9 S' O6 X) `* W Description: Adds a new custom post type for site-wide notices.0 J4 m( k) F d) I0 h- H0 Y
Version: 1.0
- P$ ^9 |3 o5 z$ {0 @7 z" [, s# v# C Author: Your Name
# S8 w# ]) A& v% m( s% Z Author URI: http://example.com. y0 l4 j- X% m; y: I$ M
*/
. B( q8 V3 ?* [$ \4 \6 C l2 S4 ^
5 {* z0 t) f$ D8 { // Add plugin code here...2 A1 A$ U7 j8 D% q
```
) A/ `/ ]- T; b' z
& R0 S9 m4 U# ^" E% o) z$ X- d2 V. c 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
% C9 ?6 v/ C4 J) G& M6 B/ v8 l
0 w1 A' ]' P: J. n/ N; e2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:1 y# R4 ?- ?" x6 I
- ?; v, Q( g! q" o ```
5 ]/ @. ~, a$ V add_action('init', 'create_custom_post_type');
* Z& e! j0 [. ~; ~$ R3 j z function create_custom_post_type() {
& ]- J; I: @7 @$ c. r E( k $labels = array(( K! b& ]8 k1 f8 T% B3 ?" k D
'name' => 'Site Wide Notices',( q/ t3 v) i- Q/ x( |% p5 y
'singular_name' => 'Site Wide Notice',
+ l0 u. e: V5 V6 a7 T2 _4 o1 B) H 'add_new' => 'Add New',
* [8 O. B. s, H" s M. _" A T 'add_new_item' => 'Add New Site Wide Notice',
- j, Z4 Q. y; l9 i 'edit_item' => 'Edit Site Wide Notice',4 J5 u2 P. Q1 Y, V
'new_item' => 'New Site Wide Notice',4 }- H$ z. Q! V! s" W; W# ^
'view_item' => 'View Site Wide Notice',
9 h" N" G: G+ H# C; R* w$ h 'search_items' => 'Search Site Wide Notices',1 `9 O. O. {1 P& j$ C' B3 P
'not_found' => 'No site-wide notices found',) [8 d8 R1 ^- e3 q4 ] I
'not_found_in_trash' => 'No site-wide notices found in trash'# ]% V! b" s) E/ g5 ^' z2 _: K6 s
);* a' c. I" n0 Z" w( T* Q2 S
; U s3 ~' {8 @+ e" ?1 ?; o) p $args = array(
: j( Y6 ` l) k6 r3 z5 v 'labels' => $labels,
. m8 u' j$ J9 \+ d) ? 'public' => true,
: `0 q- L- C: V 'has_archive' => true,6 G% N2 i. Y8 [/ |* ?% `! x4 K
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
" U' y- v8 K9 E3 J5 [ 'taxonomies' => array('category', 'post_tag'),$ Z9 E2 Z, u: A, G7 s
'menu_icon' => 'dashicons-megaphone',
0 Y$ d2 h7 D0 X( K( A/ _" i 'menu_position' => 5," q( w1 v! k9 a7 {4 \
'rewrite' => array('slug' => 'site-wide-notices')
( J9 j" i5 W. v- Z( g9 x );
7 L8 S, m8 B0 T- e9 O$ z
3 g" a8 f) A$ C3 a+ ^8 y register_post_type('site-wide-notices', $args);
. Z: X9 ?5 [7 Y6 P/ O1 a }
e" G* E6 C+ E) W ```
! B# m1 L6 L: ^* f( f) \& }9 \* j1 G6 n* F, Y
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。6 ?. F* |8 @! @
% i, c! E. H5 F, G7 _* ?
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:! k( {( r3 B; L% k
/ C% F/ r- ` s% d! ?0 R a8 [ ```& Y: N1 _6 o: z$ W. J" k3 b
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');6 P3 I4 s3 k8 ?3 B- V' A
function add_site_wide_notices_boxes() {# F. S7 X6 W# l
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
: Q; p) Y6 H/ g& M ]; t' [ }, \: h$ T; D3 F8 p F
. ^! ?- m& X/ b8 R- {; ]
function notice_details_meta_box($post) {
" M8 F- }. n) E8 ] wp_nonce_field(basename(__FILE__), 'notices_nonce');" m$ G5 r3 t$ |; ]
$notice_title = get_post_meta($post->ID, 'notice_title', true);; W0 m7 h/ O/ `* }6 a
$notice_content = get_post_meta($post->ID, 'notice_content', true); g7 K( {! n0 `$ B) l
?>: ~ Z, L. {9 M% s: c8 X6 A
<p>! V" k; M, h) J! c- g" q
<label for="notice-title">Notice Title</label><br>7 Q% P) O) M( V$ x! G5 w. O3 r
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
( [% [: x E! T& W; V </p>
8 \& z: @ B6 ? X+ z7 b) Q <p>$ a1 R+ h7 u) W7 @9 t! d; e
<label for="notice-content">Notice Content</label><br>, s R2 V% [8 S
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
- v ?' S+ R" e0 W+ R) K9 N- R0 N </p>
8 ?0 Y8 H! t& \6 I <?php
/ p2 F9 F9 `+ p V% N; [- T/ j }8 n* w9 Z" m* D- G
/ ~8 u1 b9 S7 T# P2 K
add_action('save_post', 'save_site_wide_notice_meta_box');
6 ^" [, |8 D! f. E: H function save_site_wide_notice_meta_box($post_id) {0 d* M4 R9 E* S: ?" |. P) @
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))% v: T( ~$ S b4 j& ? w# l. Q' L
return;+ d: V8 m9 W; H5 o$ o
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
9 Q0 w* @# {' ?2 |6 E" r return;3 H1 J8 B8 d' y$ m1 s$ Q- @
: v: f% m% @/ A if (isset($_POST['notice_title'])) {
- e7 @" I- Z! W& i( V update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
# `3 u1 `2 W N. V5 u6 F5 {3 { }
+ O m- W) [. A) A1 Y9 @1 o if (isset($_POST['notice_content'])) {7 N3 m( T0 U9 O
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
! V' t+ n5 Z' e$ E }9 {8 ]1 |2 m* Z. R5 ^" x" ?
}
1 e% h; p7 G' {! {0 }/ @1 p ```# B( M; _ Y4 q9 \7 {' b5 \
A! }- k! O6 ?1 z# o) n9 t 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。$ Y8 Y5 d0 K3 C, M1 r. S" c
3 r+ h/ |; I# |4 F" t/ |
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
; S- Y/ k' p6 a% o
9 x( v# ^0 f+ Q1 o ```
p: m1 e& G+ H6 H/ d2 p8 b8 r $args = array(; H/ y' w8 o+ m: y; Q, ?
'post_type' => 'site-wide-notices',6 b6 i/ \9 G7 Z4 ]& E; \
'posts_per_page' => 3,. q, J9 D- J- |/ N
'order' => 'DESC',
5 L; k+ w. V/ B: w4 z+ q 'orderby' => 'date'/ l0 ~0 Q% j% l- K6 o
);
* F' P1 v" M5 N, K \0 p8 H f $query = new WP_Query($args);4 o7 \0 h( s9 i- Y
if ($query->have_posts()) :
7 h6 C4 R, ]: }4 l* ]6 K while ($query->have_posts()) : $query->the_post(); ?>9 ?0 m: b Y0 H# f8 C# @7 D$ ]
<div class="notice">1 `+ Q+ X# I t4 d" |
<h3><?php the_title(); ?></h3>
% I0 t5 ~2 K( K- f% { <div class="notice-content"><?php the_content(); ?></div>/ D+ ~( ]8 f2 A+ n _
</div>, g; N" S4 z: t1 L' L4 ]# s4 c- h
<?php endwhile;
' {$ Q( t3 R& H7 K$ L ? wp_reset_postdata();
# R8 Y- z F( Y endif;
9 h, \& n7 I4 a+ v ```0 o# e' v% B# ^: H3 R% \! h
; a5 c! y3 @1 R4 R
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|