|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
1 R8 L1 t9 h* T8 L
, Y( f( h5 G2 n, B如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。0 _; K% {! v# D) O
8 c% i! N! V; a% f6 @, b
以下是创建自定义插件的步骤:# M, b) ^7 _ I1 A- K# P1 A
- A0 H5 a. n4 p2 |
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
, ^* `* h# w5 V7 L( V' N
0 F* z3 n1 h1 V& ]. _ ```% y0 Z" R! g! a: v- m' E
<?php
" r5 W4 n8 _% D; t! }, b) o /*
9 q5 U# j" C( g4 F Plugin Name: Site Wide Notices Plugin0 E5 Z+ {! Y1 V" n. q9 V/ {+ d' p
Description: Adds a new custom post type for site-wide notices.
: ^( o, o: [9 W, F) `% ]* M R Version: 1.0& J2 q. t: P; |" p2 q& t
Author: Your Name
1 [8 p f% d Z( U( c, ] Author URI: http://example.com% H y) _, C$ ]; C
*/1 w5 F% d5 h9 w- v4 J0 l1 X
, i1 E; S4 M" O* O6 U
// Add plugin code here...' F, i2 H; \, q w+ w
```
6 j2 n* t+ W7 ^. }8 L' ~5 a" N+ `, H h- i1 f' r0 ?7 ~
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。& T5 V3 T0 L, J2 d+ ]
: L [3 b7 ~8 m/ T/ x
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:* G% Y5 `9 P. t# a# n
( D- p* R" Z6 {! i: n, q6 s ```
! W) G; o/ z' n3 I add_action('init', 'create_custom_post_type');
( r$ }8 W% ]$ x# O function create_custom_post_type() {. F+ l( ^2 q* J" b( E- R. [. K
$labels = array(5 S" V; s" B5 ^# [
'name' => 'Site Wide Notices',. n, X. ?) z8 Q6 B# g% `
'singular_name' => 'Site Wide Notice',
& [& s( f( |) O, } 'add_new' => 'Add New',& M0 Y L6 @, Z1 m" F
'add_new_item' => 'Add New Site Wide Notice',
+ Y, g: ]7 T5 r5 u" H k1 \ 'edit_item' => 'Edit Site Wide Notice',, k9 S& i8 H: e) M' P
'new_item' => 'New Site Wide Notice',
+ ^. `7 G% W; j: \ 'view_item' => 'View Site Wide Notice',: s" P/ }/ B6 A: C% t
'search_items' => 'Search Site Wide Notices',
4 u. L3 i( R; H" K 'not_found' => 'No site-wide notices found',
v4 ^# M5 ~ }/ ~" n& E2 \3 K% w 'not_found_in_trash' => 'No site-wide notices found in trash'
0 \* L2 e" `$ U3 s; g; S6 [" k" z );
% J: Y/ C3 V1 H5 \6 q
, |. n6 W2 @8 z& e $args = array(
- C6 Q6 @- k1 K" P 'labels' => $labels,: M+ h2 t( u4 ~, U& G1 ? M/ i& s/ u
'public' => true,
2 \7 [ x& t3 `$ A7 [ 'has_archive' => true,$ r" f' [8 W) d6 v/ L7 t( P
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),( m5 B, E8 e! B8 Q: |
'taxonomies' => array('category', 'post_tag'),8 e# A8 ^8 M8 @3 h$ {6 o* V
'menu_icon' => 'dashicons-megaphone',) B! x! o* C0 I) y. k8 D
'menu_position' => 5,2 }( T5 x4 z' c% }
'rewrite' => array('slug' => 'site-wide-notices')
$ } t0 M7 o1 \ );% {; I) X. I9 ?& b; F k0 m" R3 h
) w9 `5 v" c% m4 v6 m, m( e
register_post_type('site-wide-notices', $args);
) l5 x0 p' O. A0 Q; n7 [8 ^9 K) M7 G( G }
3 C+ Q. _; ?3 Q# i/ b! J ```: ^. x1 q3 Z' `! d( h
4 \2 H2 Y- s4 m' X4 a/ B
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。1 Z8 M- p/ j" M. |- j
2 r7 h% Z- P, M: s8 R) D7 O% Q
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如: B: t0 w& p' ?( D) w1 |/ f
$ h- D/ J" G9 H& r2 ? ```
" o2 N. M4 V; {3 O$ h/ x add_action('add_meta_boxes', 'add_site_wide_notices_boxes');# [; m9 e& @6 G$ x
function add_site_wide_notices_boxes() {. }+ @$ H3 ]. H8 ^! ]
add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');& }6 F; N, o& \ Q# q# n
}
' K6 a3 p$ X0 f# m$ O5 P
; y, F3 w# k- L function notice_details_meta_box($post) {
1 ]( _% k5 S3 Z j wp_nonce_field(basename(__FILE__), 'notices_nonce');
9 ^3 T: L/ j$ P1 _/ g. O $notice_title = get_post_meta($post->ID, 'notice_title', true);+ {: b2 S% k0 l+ M% O
$notice_content = get_post_meta($post->ID, 'notice_content', true);0 q3 t8 e J/ l- N0 P
?> [& L* a5 o0 v" ~
<p>
+ h* p; @- t3 ~: J' r <label for="notice-title">Notice Title</label><br>
2 x( |' p1 D% j; o' v1 L( e# x <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
# Q5 T" @" r* E; j </p>
/ I/ }4 X8 b9 U: R8 C <p>
1 L5 Y3 ~ v0 a" a <label for="notice-content">Notice Content</label><br>
, n" c7 X9 U/ c <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>( v7 q/ u* v2 f' P, h) p
</p>
" M3 ]( q f6 X5 b$ Q/ {% ? <?php& @8 y" @- M9 Q6 L; Y+ A" q
}
/ g0 P b6 i8 H2 g0 V/ y# _% ^3 ~; Q {8 Z/ l. T1 c
add_action('save_post', 'save_site_wide_notice_meta_box');9 f* z6 o6 U; y* Z- e* B) a% a2 b
function save_site_wide_notice_meta_box($post_id) {
M% p* H3 S7 }3 V2 F$ Y" f if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))6 {- T* k: J; [
return;# s; T8 K% I- J1 v. ~* B3 b U6 t8 }
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)) R: N, j8 W0 F+ z# s0 i
return;1 ]' a/ q6 p! a. \$ R
9 Z: o( z5 q: |2 O
if (isset($_POST['notice_title'])) {8 f- g. {2 t' h8 t7 i* v. D8 Y
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
, w+ v3 @" Q- J2 |8 |$ [6 ~; b! T }0 k6 W, D2 ] a9 B/ o$ D/ s
if (isset($_POST['notice_content'])) { `- ^) {4 j( E
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
, D6 g3 _' j; ^. h+ O. e$ [& ~# y; ~ }
1 {5 \. j/ g: G# { }* u' e& U; L) b8 t* o
```) r, F8 S) z# D6 C+ g( D/ v
- L* c2 j7 i) j& C$ j: j7 q8 z 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。
# [7 k6 c0 t1 T1 _' x
* b7 R# u6 ~! `; ~/ _- A r) Y4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:; f: K% s& R, X) A- y
4 `1 }$ a4 s3 K4 Q0 e
```4 H% s4 I( D) [2 }3 s/ m* p/ f1 L
$args = array(
( `' Z; Y" b! R$ C/ W 'post_type' => 'site-wide-notices', Z, M9 b$ \! g; \: N$ k
'posts_per_page' => 3,
0 O: m. g7 d6 u 'order' => 'DESC',
% A* f( r- ?& k- f2 E* Z 'orderby' => 'date'
9 J: @. Y5 w, ]# _ );6 L& K% x3 S* p' I) O6 {' x
$query = new WP_Query($args);" P& P. Q v7 z' n% G4 ~
if ($query->have_posts()) :8 M" C. B$ q1 j$ J# K7 O' Y u1 q
while ($query->have_posts()) : $query->the_post(); ?>
8 v: A3 P& K( M2 i$ } <div class="notice">5 |. y( a. p# N5 L4 f
<h3><?php the_title(); ?></h3>
# Q! f2 F( z3 a) _" C <div class="notice-content"><?php the_content(); ?></div>! |9 j/ H+ \( P! S3 w
</div>* {8 w' G4 G3 S* B
<?php endwhile;
/ M- g" p$ _% c0 ]5 g wp_reset_postdata();" X2 m4 Q; q, g: Z
endif;
( Q8 c* N# h. @$ E& s ```0 u$ d; M l+ x5 M/ E( `/ i( x; i \3 v
" k/ x4 E& x: t/ j* V
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|