|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?' e8 [+ w, e4 x, m; ~; b
& G' [( ~0 ]. V0 a$ ~) `
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。' r3 E N1 h6 p1 T
9 b9 m! K4 H" E9 I7 w( T以下是创建自定义插件的步骤:
2 U4 Q1 f/ H+ C' M0 q' h
! n- p9 r7 ]1 Y2 m7 w4 [/ |1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:. {5 F. r: E8 E n; d
: E' R( f! ~! g6 H, m
```
7 c3 e: ~* s' U, v, z6 B! { _ <?php T* g2 Z% R* n) n, H) n# U+ R; C. j
/*: s6 R4 M+ j# @9 D9 K
Plugin Name: Site Wide Notices Plugin
6 J; Y6 ^/ w4 _7 d3 |3 q Description: Adds a new custom post type for site-wide notices.$ ]/ x! A% Y2 J9 }- ]7 |; u
Version: 1.0
4 x, Q9 v1 k4 c H) c7 y2 R: u Author: Your Name7 h. R. X7 s* S8 p6 q
Author URI: http://example.com; D3 v, }) D4 c" E. o! M$ \ O
*/
$ g5 N& @% i/ j& V2 q8 X9 E" m5 W. O* z, n' l0 Y
// Add plugin code here...$ ]2 r& r, g+ o& b+ r
```
2 v* X I. C3 e8 [6 h2 W# w8 `' U* [/ j, p; `
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
5 u( o* v$ j r2 D' ~! J. N2 q0 E0 {: d
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:( ^* n0 @7 g& s2 g g" N4 }& _
8 o) V% M6 N s6 Q ```
9 J' \* z0 B) c" T7 x! w add_action('init', 'create_custom_post_type');# D9 N: H; w( E0 {* i ?
function create_custom_post_type() {
5 }8 I# `6 n% S, y/ Y $labels = array(
% m- _6 p, @. A 'name' => 'Site Wide Notices',
, i4 Q; e3 k t; @$ i8 K 'singular_name' => 'Site Wide Notice',8 w! J n$ u3 j1 j0 C
'add_new' => 'Add New',' m* H5 o6 h& ~2 x" d- Z
'add_new_item' => 'Add New Site Wide Notice',& c5 w$ q: d/ }: y- u( ?5 j
'edit_item' => 'Edit Site Wide Notice',& @4 u& k# _$ P+ P0 B
'new_item' => 'New Site Wide Notice',& f2 t: u* B+ W' J1 |" U# b1 {1 w
'view_item' => 'View Site Wide Notice',% v! E1 \! H6 f, d T
'search_items' => 'Search Site Wide Notices',
5 j8 x: }4 x+ g6 E5 r 'not_found' => 'No site-wide notices found',0 I( H6 y. f4 `1 r
'not_found_in_trash' => 'No site-wide notices found in trash'
/ r6 y1 {% p" Q0 ?- f7 a( r" K );
, X/ ~% i" \5 F+ ?
1 _% r) h8 g. c" h9 A, K4 v $args = array(
: v4 X. m6 p5 J+ a4 [' r 'labels' => $labels,
6 u" q0 c/ Y+ Z 'public' => true,. ^( i+ k0 O" T8 t- O$ g1 U; U; J' a) P
'has_archive' => true,
* `8 F- p2 R/ ]- i 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),5 P% N8 R" E Q- Y1 `4 e* M
'taxonomies' => array('category', 'post_tag'),
3 M1 J+ ^9 g2 A: k9 n 'menu_icon' => 'dashicons-megaphone',1 u z) f4 d3 T
'menu_position' => 5,% Z1 B& i' i% O# a
'rewrite' => array('slug' => 'site-wide-notices')% _( v$ p; j+ B( Z# g I
);
/ l3 }- q" ]2 E6 C$ T4 T
+ D5 z) D' F/ Z5 E2 S q2 v6 Z register_post_type('site-wide-notices', $args);, r! F/ I1 l' a0 @
}
, C; m+ M* A$ ], V7 u) V ```9 |) k2 T+ o- S/ K3 _1 l5 h' k' n
' a7 s$ m6 }4 S4 \9 S
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。9 e5 t. }* p0 ]& Y9 o* L
% O1 }$ i) U X& r
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
& Y7 E; F) g# p# l( z3 L$ n0 a3 h* O1 x7 E' @/ Z$ X* a9 B4 y- j
```! v3 Q8 k& W& V) H
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');) k1 E: [! S: b' H c$ ]6 E1 y0 F
function add_site_wide_notices_boxes() {
0 e- m- X$ D" i W; N add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
" i" Q0 x! M' y+ [/ u; U }. ~ p j/ F6 \* ]1 O
7 H7 P: n9 d/ `' `; o! j) h- S function notice_details_meta_box($post) {
8 ~+ Y9 c5 {% N/ r wp_nonce_field(basename(__FILE__), 'notices_nonce');" W$ [3 E: l( U$ ^( y4 A \( f1 ^
$notice_title = get_post_meta($post->ID, 'notice_title', true);; k) k7 d8 H+ b2 ?
$notice_content = get_post_meta($post->ID, 'notice_content', true);
" r* l4 R' S( N X: c ?>! u' [0 U* S! G1 G6 S( w
<p>" A. r9 B. w g+ g
<label for="notice-title">Notice Title</label><br>
( n2 Y$ j% s; x8 a% g <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
$ X! g7 N+ S5 M: h9 V' I </p>
& ?; f* H( q3 E4 Z <p>1 p2 n% m' q) k9 \4 B- i
<label for="notice-content">Notice Content</label><br>8 B" J, l# s" g6 J7 K8 @! K
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>/ |' d+ K& J2 X# ?' J4 `! t
</p>; K1 L# w3 y4 |$ Q. W
<?php
* B+ B% ^4 f6 F2 ]& w1 D/ o }. C% G% w5 f! A; U$ P- R
" k" O4 \ o+ _7 E% S3 W+ h& ^' a7 C add_action('save_post', 'save_site_wide_notice_meta_box');
* A1 }7 F% o/ Q: v/ q* x3 q+ f% R function save_site_wide_notice_meta_box($post_id) {* T, C8 k. y" C0 U; A
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__))): d% c; ?) y$ W/ \1 ~
return;
1 l9 m8 `% S( {& y9 E. ^9 q7 a! f if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)( m% y) N' q' B6 K; L% Y
return;: S0 @! q* Y( r2 @7 z
- g. ~' f. H3 g9 N; X
if (isset($_POST['notice_title'])) {
$ U# M+ M6 R4 d: L& i$ c3 \% q r update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));* j2 e2 b9 W# E5 S9 D
}
& x4 Z; p( |' Y5 v4 q if (isset($_POST['notice_content'])) {) O' n( {9 e# \% ~! V% ^
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
7 F i# J4 n0 S0 M/ I }6 D) c) z7 c7 D0 d* c, \
}
& x! C R0 R2 s ```
" c) c. \5 X% v( J: ]5 N% F% q d
' P" P. e3 w& ~ 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
( x) O" H4 q. }
N3 D& b9 u: R/ C' t2 ^; k4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
+ `* r) _: F+ e# w% B& o4 x6 x/ `1 P1 }, ~% S. o; A
```# G/ X1 @* m, g* h+ l, r. a1 ?& M9 C' M
$args = array(8 I& X8 b: e* t
'post_type' => 'site-wide-notices',& f& @5 G* ~5 K, ^
'posts_per_page' => 3,, r! b# S# e: F" ]: b
'order' => 'DESC',
0 O* m4 l8 d* O& o7 X5 G 'orderby' => 'date'* Q' r4 x# ^! a- _2 e& ^
);( e# g2 }1 |6 `
$query = new WP_Query($args);' q O& f$ z, E/ ?
if ($query->have_posts()) :5 ^0 }! b( k. G* y2 v& D
while ($query->have_posts()) : $query->the_post(); ?>
% q- r+ Z$ S) T <div class="notice">
7 {2 V1 c' l4 W <h3><?php the_title(); ?></h3>
% N: U) v0 _$ Q$ c# w8 r <div class="notice-content"><?php the_content(); ?></div>
n! Z) M" N- t% P5 Q- w/ r </div>% C6 }5 {, ?( a% w6 G
<?php endwhile;
: W: @2 E$ o( M# I" q( [% Y wp_reset_postdata();
' a! |* a/ Y$ U, j endif;0 S' q2 F% V( E+ c0 p$ o
```
/ F0 X& |; K) z. H }
- ?1 z- s9 O* f9 X8 t 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|