|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
1 q$ r6 r' A, g* H9 Q/ O- `- R
# g/ }2 x0 z; _4 `- p如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。$ d3 p: E; l. l7 P
: j+ {9 q0 R2 {+ K
以下是创建自定义插件的步骤:
( P5 z. a9 z: l6 O+ x5 W, @' s( J; @
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:/ o8 Z# W9 [5 C! W w" A
7 h7 H% R2 p5 Q ```
' L2 k0 D$ F( ]4 y3 ?7 A2 B/ q <?php
& f9 y! H; f \! s) o1 u /*
( q, h) Y( N4 J2 Y6 S Plugin Name: Site Wide Notices Plugin9 U; W8 {/ F1 f4 u
Description: Adds a new custom post type for site-wide notices.
' ]% D! D' F! v4 o Version: 1.0
) P1 [5 ]1 o( {4 {* Q9 z Author: Your Name W. ~5 K2 u& p) {% [
Author URI: http://example.com3 Y! a# o5 R, x" v
*/3 _0 J+ C! C0 L( s2 W; p/ w* t
. `0 ?' ]' ? q8 G# h // Add plugin code here...
! t! d, v8 v) O# w1 p1 A Q ```4 k* A& ^* A8 Q+ b0 c3 y; k" z9 ~
. H8 Z8 U' V$ j1 n1 P) O* G' P 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。- U) P& D* u V3 C$ L
: a6 ]4 S$ Y% Q7 q2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
" k0 O ^5 L+ ] m' f, U5 l" } Z% c: q$ Q( ~% z; ]* M) v* [
```
$ T: `& b9 j1 r* U add_action('init', 'create_custom_post_type');: ], z1 B+ h* e5 r4 ^5 Y
function create_custom_post_type() {2 k2 Q7 V3 L% X8 g8 R$ \% Z
$labels = array(0 A) C7 }3 u; n8 R# ]
'name' => 'Site Wide Notices',5 f- Q) F, b+ ~& p
'singular_name' => 'Site Wide Notice',
9 h1 r% P/ i/ [- Q6 B4 e 'add_new' => 'Add New',( @( U& k% o3 ^6 o1 y& x; P8 u
'add_new_item' => 'Add New Site Wide Notice',
& o0 }* l0 w2 k5 ?( E 'edit_item' => 'Edit Site Wide Notice'," H% D% A% G# b$ @
'new_item' => 'New Site Wide Notice',
+ l1 U) F4 b' y/ v! E0 m- p! X 'view_item' => 'View Site Wide Notice',
* ?3 \ X2 m1 {1 b- H+ I 'search_items' => 'Search Site Wide Notices',
$ @: t$ N4 b- P, q8 w) Q( Z 'not_found' => 'No site-wide notices found',) v0 i* V& n v
'not_found_in_trash' => 'No site-wide notices found in trash'
$ n% j' F- c/ q) @; \ );& c4 K% ^8 o/ z. E* I z
# X0 P9 T* v7 Q b. Z; @! X4 A
$args = array(% B) L% s _% w6 u4 K. u% u
'labels' => $labels,
: w( a3 q/ A+ x# J 'public' => true,
9 D! j. j7 h }6 [5 P* u 'has_archive' => true,* B! M c/ n1 k% `* d: s5 k# B
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),( u! S T& I% y; \$ O7 J9 Q$ O* l
'taxonomies' => array('category', 'post_tag'),9 v) @0 Y7 l4 Z0 k
'menu_icon' => 'dashicons-megaphone',
& }" I8 {7 ~* } 'menu_position' => 5,
. r. @8 J2 K# K5 O 'rewrite' => array('slug' => 'site-wide-notices')
) I4 i! X% J0 x1 _3 Z/ S );) F; B) Q) Q# m5 T
; d! Z8 N2 F; g9 H& @' r0 L4 s5 p register_post_type('site-wide-notices', $args);
( a4 `6 V2 o6 S. e }% j }( M$ b" _8 f
```
" }# u+ N3 ?- u- s9 I% a' l; W- u& S5 {, c; u+ x+ K9 k
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。* P; o! s' O, u, C
a. Q2 d2 o3 n, v }
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
8 O& N0 b" X. X7 f% s6 t' S% r% \) X1 l4 ]* w$ t/ R! H
```
- P1 x% o. }! d6 J+ o0 j6 G3 L add_action('add_meta_boxes', 'add_site_wide_notices_boxes');4 j( H6 \( X* R$ P& t3 R5 I
function add_site_wide_notices_boxes() {
$ ~: }+ K. J" l+ ]& c8 V add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
. [% k3 ]' @" N# B }. E9 ~! g- u" s/ V" X" j
9 k$ ^) `) J$ P* i2 Y+ \ function notice_details_meta_box($post) {
% @ Z; o3 z& d# Y6 v% H8 ] wp_nonce_field(basename(__FILE__), 'notices_nonce');6 }4 U- i! J0 x4 q, X Q/ @) |
$notice_title = get_post_meta($post->ID, 'notice_title', true);2 ~ O7 _9 b2 L w7 F- ]+ L
$notice_content = get_post_meta($post->ID, 'notice_content', true);
! D2 [3 z* ~; Z5 N/ d0 h2 J. u ?>- {, r9 Z5 X) b# v/ v5 w7 E
<p> [. y- n" |' {7 |( `9 j0 C
<label for="notice-title">Notice Title</label><br>
6 p1 z# p4 u( V- b' g# O( { <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">: T4 K) Q6 \! S; @+ ^/ P2 Y- u
</p>* ?- ~9 L: l$ N/ f' H' d: V K o
<p>: @1 |- _& o* W: t
<label for="notice-content">Notice Content</label><br>
" p# Q3 f' h0 o- ? <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
2 J, \# J1 k2 K: {7 U* m </p>
, h, z. e6 L: H <?php& B' H8 p0 r" M0 \: |
}
0 f, A& d2 h# g3 c/ v* A( @9 |% e* H1 W6 N
add_action('save_post', 'save_site_wide_notice_meta_box');- ]$ B# J& h& ]. C$ u
function save_site_wide_notice_meta_box($post_id) {
: p. i, W$ \* {2 s7 C' F3 F if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
$ J! J/ }' R. R9 w/ ` return;
$ o1 L% T0 j/ q7 S1 u. x7 | if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)4 ^2 b' I5 t# D4 M! f2 N
return;) v: \; y d2 O4 N
! P* M' b* n3 i9 S2 ], R4 J if (isset($_POST['notice_title'])) {
2 [$ @1 o; ]1 W/ W7 Q; E update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
! a3 o4 w* c8 z; m0 D3 p6 [6 v }
6 @: R6 U! f) b5 n if (isset($_POST['notice_content'])) {
9 c9 Y8 o1 d R8 W* H# b" y+ L update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));( O6 n! f7 p0 G1 D- e% W
} S9 E" X4 }6 [& q- A0 E
}
$ w2 T8 n) ?0 w. X! p ```$ t( _. {1 B/ y- N& u- x
# N' D) V6 }$ _& G( p
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。8 c5 _8 a7 h4 m& [
( u F( B: h3 R) _4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
. t2 S* W% c1 E' z i! ?* V6 |% J% w, v f4 B
```0 m! Q5 p$ B7 g3 G3 k/ S
$args = array(
: M9 R* l U; w8 j' H1 Q. F 'post_type' => 'site-wide-notices',
. P- e @/ g; E$ L 'posts_per_page' => 3,5 x3 `' E# W; Y1 L: w) J( f- }( D( ~
'order' => 'DESC',
5 H8 w6 h& W% g! v- @* s/ {) U 'orderby' => 'date'3 I1 N) ~6 F+ d
);
% Z- m i4 b% f9 ~3 _& z+ @ $query = new WP_Query($args);- g: C' S, G1 F6 d {6 A
if ($query->have_posts()) :' V/ h; ^7 G2 m- q$ [
while ($query->have_posts()) : $query->the_post(); ?>
. M" ?+ V8 v1 V. Z& h' t g* j! x <div class="notice">
8 r" n! e7 J5 I% W* }& \+ R5 E. D3 p <h3><?php the_title(); ?></h3>
4 f7 ?2 o6 F# l7 J <div class="notice-content"><?php the_content(); ?></div>
" G9 y1 _* V; Q9 S </div>
* E$ J4 r5 N0 Z6 j. D <?php endwhile;
+ P5 z7 a. S3 C) d wp_reset_postdata();
! f/ o+ a% S8 z g endif;
! l8 y" ? w8 w# b' C7 ]8 f' E ```6 x7 Y! B7 F3 ~. S9 v+ A% k( i% i
a9 `: o5 d. k; {5 c/ U) r8 p 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|