|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
4 F& f$ s/ j9 ]7 U/ A1 P+ c7 v, W0 M- q' t7 p! T
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
5 S- ^, |' o. h& w4 r$ }
) I ~* v( ~. B8 |9 D以下是创建自定义插件的步骤:
8 m5 t6 v; r6 V- p
4 P4 R& C" j3 z9 F" F; d1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:) |4 z) b7 g. H# Q2 t+ B1 V
# W: C% {6 i; K2 H1 V: D
```
7 o d) E& m& ^0 l4 h, U2 \6 g8 } <?php
6 h9 g. C. {; P: c9 A7 o1 C6 E /*! l% x& g# Y4 E& i& j8 E
Plugin Name: Site Wide Notices Plugin1 B$ D8 Q4 d/ E4 z8 G
Description: Adds a new custom post type for site-wide notices.
9 ~7 |9 A9 @$ H- g, o/ f Version: 1.0! N4 M4 V- x, [* q5 q
Author: Your Name1 R- V+ X% j9 K7 g8 T* Z
Author URI: http://example.com
2 N4 F, K7 G8 w" e. ? */. c! H$ b. q' D8 Y1 E: j
" e$ o2 d8 s, B9 e( P R, ]# o // Add plugin code here...
C: C* n6 `8 k" z- `( t ```
( X9 @3 G9 v5 A h1 e- T1 b4 v! N5 Z
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。- q% V: Y& J4 f3 ~$ Y: m5 f8 U% X
- D+ Z5 r1 p- F7 T2 I
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:5 a% I" A T( I* `9 K) I% d* C
* v8 D7 w. m/ {; f |
```% q8 P3 d% M6 c8 k z. Y
add_action('init', 'create_custom_post_type');: o% |+ d8 M4 ~% `
function create_custom_post_type() {
* B. b D# j; r4 K $labels = array(6 s% |' l& r+ a0 m
'name' => 'Site Wide Notices',. s9 B0 Y5 Q5 n7 Y1 s+ X
'singular_name' => 'Site Wide Notice',
* U# o( |3 U6 G( C' N% ^2 _ 'add_new' => 'Add New',
2 u( u5 S5 @- W4 a7 N7 m 'add_new_item' => 'Add New Site Wide Notice',
& t8 B' \* y$ o! Y* [- ?1 B 'edit_item' => 'Edit Site Wide Notice',: K$ q1 ?" l9 p
'new_item' => 'New Site Wide Notice',
; \- Q: f- [2 B" z" h" l 'view_item' => 'View Site Wide Notice',7 G: P8 [: s/ j5 h
'search_items' => 'Search Site Wide Notices',' p5 p5 m" Z4 l( J& S; ~8 b
'not_found' => 'No site-wide notices found',2 ?1 O( r# I( y% c4 q
'not_found_in_trash' => 'No site-wide notices found in trash'# ?+ I9 d* |6 O$ I
);$ g4 n7 H: n8 L* {1 i
k7 l m: J: m+ \ ?+ }( ^
$args = array(
5 u3 d8 d4 t- t. ^" n 'labels' => $labels,
" S1 Y1 m4 i7 k; V/ b9 G. [ 'public' => true,& ^$ H4 A. B# L) b. B
'has_archive' => true,
/ V, @* a. z* w% h P3 ]& {1 ~ 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
) U. m4 b) k. i$ p2 u7 H- I 'taxonomies' => array('category', 'post_tag'),
* Y. D4 U T4 o/ q8 B: w5 X 'menu_icon' => 'dashicons-megaphone',+ v% Q5 H2 W. t# R
'menu_position' => 5,
- l% t7 a4 ?/ b# | 'rewrite' => array('slug' => 'site-wide-notices')
/ M% D/ l# m$ M6 a );
! V; y% X% H% v
% N" O- R9 E& ^ register_post_type('site-wide-notices', $args);; B. \% ]0 m- ~2 v
}- b9 D$ y( W0 h9 i8 F( _
```
; d$ ]9 Q: U2 o' O! |; R% w
T, y" ~7 D; V# h1 T 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。 ^ J' \0 S5 `4 ^) G7 g# K7 y$ |( w- m
. h: {1 X& r4 Z# M! I$ W/ ]
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:' A/ @! b) _( x: a, \
$ i9 w1 L3 ?8 O* l# C ```$ ^4 l' a9 [! ]# E: v" {. V* Y& |
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');2 {- I" Y" f+ B3 J7 M8 L9 G
function add_site_wide_notices_boxes() {- Y& l* ~; Y; e
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
' N: D2 W) q, Y8 X! g; A } O2 p0 w* Y( h$ ~8 d* r
+ Q5 H/ G3 N; n, _
function notice_details_meta_box($post) {8 W- o# `: @# |: G9 }/ g
wp_nonce_field(basename(__FILE__), 'notices_nonce');
4 U4 J: r# d8 ~3 v $notice_title = get_post_meta($post->ID, 'notice_title', true);/ t/ @4 [, Y0 S% H, ] r" J
$notice_content = get_post_meta($post->ID, 'notice_content', true);1 Y1 g* a* G' k5 P ]
?>* ^: M# t* a2 s& n4 w6 w& Z9 ~# |
<p>
9 |. I5 E! x- z2 B3 N4 F <label for="notice-title">Notice Title</label><br>' v5 |; b; l! J/ {: T
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">; H! Z& G# j5 a8 A% B
</p>" F3 C( w. k- t4 m
<p>8 Y u T; A) H$ B3 T! [
<label for="notice-content">Notice Content</label><br>
( B+ h; V3 v9 }, q6 C <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
1 @6 k8 U, O# o% ?4 {! K </p>
9 y, u- ]- G- V# l <?php& u! g( y+ b+ {, j' {
}7 R: D) ~) Q% u: w7 x6 |
/ Q7 f; h# `- h5 p add_action('save_post', 'save_site_wide_notice_meta_box');( y7 s6 e( C2 B& P. ~
function save_site_wide_notice_meta_box($post_id) {
s* }$ K# e: { if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))2 O% U( k, G1 f3 r
return;' z& j' d: |$ e& ^- }
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
" {4 b# X0 F5 R ^: ^4 r, l/ z- k O& U return;
* ~7 v$ Y/ v0 F `& q. E) W( t$ A6 M! Q( }7 l
if (isset($_POST['notice_title'])) {
. \0 T' d" t) T- O" X1 ^3 r update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));8 S, L" e, o+ `+ X. I
}
\ D0 v+ V4 ~ if (isset($_POST['notice_content'])) {
' M2 Q5 m4 @0 a% M8 f, v0 g; Z+ z update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));3 D3 Y9 z+ ~* H+ q$ z# q/ V& f
}
' Q) B- C4 S5 [! o }
9 F! W) a; g: u* W w5 ~ ```
2 S9 g7 b$ v& w E: w8 q: j# e! W( y
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
U$ A% _+ f$ p) E! W4 p( _7 D- M* j( ]8 h- x3 T- i4 U/ t1 S/ F- N
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:& p, X) Z: m2 h1 t2 f8 l
+ v. I" ?+ D v5 B3 q* n
```5 A1 ~/ M/ ~) Z3 U) Z
$args = array(
* P6 B/ h2 w9 h 'post_type' => 'site-wide-notices',
2 h4 N( n1 ~ V) K/ [# s 'posts_per_page' => 3,
! M/ _$ [3 y7 W5 P$ F 'order' => 'DESC',
4 w+ L7 Q; c/ S. V& D" l 'orderby' => 'date'# M+ {4 {# K9 c1 S
);+ P/ E/ q! v1 ~/ H/ L9 b* e
$query = new WP_Query($args);3 G3 }. L5 Q @. \& o
if ($query->have_posts()) :/ b, k% ]0 ~! l( x& {: t
while ($query->have_posts()) : $query->the_post(); ?>
' Y: A9 _/ n9 H+ I& M) t <div class="notice">$ f& i- V! W7 U$ U. z& X# I
<h3><?php the_title(); ?></h3>: |# q% e1 M, [! h/ g1 h
<div class="notice-content"><?php the_content(); ?></div># ?: B4 m( b1 M9 \3 R+ Z* v
</div>" A9 b( z3 `/ U" U
<?php endwhile;8 w/ Z8 E6 c) A) ^7 g4 \
wp_reset_postdata();
4 Y6 [" u5 d/ o2 I+ l2 Y9 i% c endif;2 Y* O2 G4 m( E
```
, \0 \- B) e. v7 J
# \; A: n. @2 J0 E4 s7 @ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|