|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
. q8 U" K, `$ |9 Z! k/ G8 G# ?9 H$ u6 N) w4 m8 s
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。. A$ |/ H2 z; ]+ q
0 A8 N, ~4 E! ^/ g4 I) Z' T以下是创建自定义插件的步骤:! r* h) E" o8 D+ ^6 v h
7 q' ?3 Z3 O% F) H. `( z1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
0 Z) h% e1 X0 j/ v: d+ G% d2 c! ]3 B* O1 N/ Q( w
```
' Y8 J& _6 w/ i: E# |6 ~ <?php, U4 {9 k0 Y3 O/ y
/*
- [+ p* S+ u" I8 t T4 M Plugin Name: Site Wide Notices Plugin3 t7 |& ~# ]: u+ V* j# j. @
Description: Adds a new custom post type for site-wide notices.
9 V! Q3 G+ U0 z) t$ i0 P( O Version: 1.0; _0 A5 n6 r2 k6 C
Author: Your Name
1 e# a& @9 p0 w/ c" _. F/ p Author URI: http://example.com: ~ U$ I; O* q% v
*/9 l {" C, H) r& ?
5 D6 t7 b- w/ y9 y
// Add plugin code here...: g! P+ g, {! R, G p6 ~" h
```
5 f+ B9 y; R9 y! s5 r
( T% ^3 u7 a7 A% ^ 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。
2 s L+ [% @" [ `5 {: ~
, d9 |, Y5 x8 N/ e% }2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:$ F$ ?4 ^* D+ }
# I |0 D9 c1 H& K& f/ T ```
/ z2 p. E6 p3 P8 V add_action('init', 'create_custom_post_type'); j; R7 ]$ X3 t, L) x/ v, s
function create_custom_post_type() {# [9 i) n8 N3 |2 B" s6 ^" \. u
$labels = array(
% q8 W+ |: F5 ~. f/ q [2 g 'name' => 'Site Wide Notices',: x7 \1 u8 t% s1 c! W5 C: E( C$ n
'singular_name' => 'Site Wide Notice',
# X$ W' c! C9 Y1 l9 K 'add_new' => 'Add New',
+ a+ r7 q M: p 'add_new_item' => 'Add New Site Wide Notice',0 q8 O$ v# P3 r" A
'edit_item' => 'Edit Site Wide Notice',* M* b- L3 V- F
'new_item' => 'New Site Wide Notice',4 Q# `* i7 U3 ], z1 k
'view_item' => 'View Site Wide Notice'," y3 j2 q- z& F3 e" \/ I- e
'search_items' => 'Search Site Wide Notices',; X+ {" j; s7 S' f
'not_found' => 'No site-wide notices found',% {+ E" \. E- W* q/ ]# Q
'not_found_in_trash' => 'No site-wide notices found in trash'
3 [# D& b% Z/ o) v6 F4 L );. B0 ]2 _: S% F: n- a! r
' Z3 ]% F! B* X$ F- w* E' K: r $args = array(' F5 ]2 M6 a9 ^3 Z8 S& E% N
'labels' => $labels,, d* c$ D; u& _: h, d3 q
'public' => true,
# r, v8 C$ u( k- g. \9 C 'has_archive' => true,
$ r: t; E2 Q! d/ ]/ o" u. p- i 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),8 z T- E7 y4 a; a
'taxonomies' => array('category', 'post_tag'),) v* `3 Y- W$ U) C8 t
'menu_icon' => 'dashicons-megaphone',3 n1 _! ~. K- o" H, ]
'menu_position' => 5,
5 s, I) P/ f6 w2 L3 d# u; X! B 'rewrite' => array('slug' => 'site-wide-notices')2 K- Y) j* i2 |' ~$ r Y; |/ g- j
);
% f. C1 C6 F4 m) M0 q2 Q
1 `, v0 z5 t$ k4 I# H8 R register_post_type('site-wide-notices', $args);/ O! w1 x9 F! r; z3 y# c
}
: m+ V; J" w( H; I1 \ ```
! x; o# i/ Q. O. p R7 Y( g' s4 p* ^- S9 y9 e9 |9 L
在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。
# w5 g' N" F7 L- ?1 z
& s: g4 W2 F. V* ~7 i0 d4 V3 r) j. K3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
0 R; T5 S. q M5 ^ A$ |; [2 \0 x# D$ a4 Q, b
```5 n4 p5 p1 Q: D. ]& x
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
5 E+ R: A* J! V9 l# a function add_site_wide_notices_boxes() {
. N8 k7 F3 |7 Y/ w( a9 r add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');, x7 @6 ^8 f1 C
}, x% R" i' \0 B! b. K- X2 Z" b, h
' ?' ?# e& l+ x% I: \4 I4 Q2 P function notice_details_meta_box($post) {
- B- D7 O1 P0 J/ C& h wp_nonce_field(basename(__FILE__), 'notices_nonce');
' F& J( `& o4 E( W P+ T: S0 c $notice_title = get_post_meta($post->ID, 'notice_title', true);( R# _4 K. M/ {" K0 @" U1 p
$notice_content = get_post_meta($post->ID, 'notice_content', true);
- G- W. G, o# w# f- N ?>
; m6 u$ D# X6 N <p>
9 S4 ^: ~& @& Y m0 T% z) Z <label for="notice-title">Notice Title</label><br>
: p# R3 l; p; u5 d9 C0 S <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
/ d8 V9 X |5 C, L' Y; w ^/ s </p>: w5 t' M) a9 u
<p>
4 t9 A$ E$ ?0 X+ n0 h <label for="notice-content">Notice Content</label><br>
' ~$ W" k3 c5 E& S- ]8 i! C2 X2 o* q <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>8 L% A E3 M+ b$ i7 a' z
</p>+ Z6 Z9 Y3 _3 V4 F1 E' S+ B. \
<?php- T2 a1 a6 M7 k7 X7 L* @& b6 g! I
}" H5 I3 i* @- p. d% v- {0 d
0 p3 y- Y* [* r add_action('save_post', 'save_site_wide_notice_meta_box');3 j# K8 k. m1 t( a
function save_site_wide_notice_meta_box($post_id) {
+ o$ Q- \3 I l% G# M! Z if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))& ]+ O- a" c0 W! e5 D
return;9 p3 d* a1 H! P; c7 R* w1 J
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE); E6 d4 x" K0 h/ `
return;
5 x( ?4 E* {2 y5 \# r
" Y0 s4 L- P3 g$ h if (isset($_POST['notice_title'])) {
. G# n0 k# ^, h update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
$ s4 X/ L* a* I! ^3 \7 }7 Y }, T0 {* N( _) o
if (isset($_POST['notice_content'])) {+ T/ m0 p% N" N3 A% y
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
/ \9 L; P3 m7 s% P8 q8 X1 r }: C" d% o8 u* `' E Y8 k
}
+ @( e% O6 `; V ```% F. Q: Q8 m" [
& b j( ]3 j5 h- e6 d& T 在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。7 w& Y0 ^) ]3 k3 x0 `# m
. m9 F/ v* C' Q
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
* q4 x' q2 I4 z* g) H- Y l1 }! Y( t9 c8 i
```) Q$ F% b0 |6 s
$args = array( E& |) a+ `; Y! n R6 M6 P
'post_type' => 'site-wide-notices',
: x% [- q1 A! g' ] 'posts_per_page' => 3,& W1 o3 f& l5 [, z, |
'order' => 'DESC',
/ w6 t3 W& J$ D) f7 U* t 'orderby' => 'date'* Z& e& N8 d% o9 `% i7 s/ u
);; W- `2 `3 Q( g8 Q9 |
$query = new WP_Query($args);
* W+ i* G% V2 b& m' {' J if ($query->have_posts()) :% G+ V% N! _' H9 D6 t! v! X
while ($query->have_posts()) : $query->the_post(); ?>
7 k) G- n- L2 A' s* r7 u) R) @$ ]8 | <div class="notice">5 _$ @3 G3 n7 w! c6 M6 m
<h3><?php the_title(); ?></h3># Z" b7 f3 g _) n
<div class="notice-content"><?php the_content(); ?></div>9 P' H1 H4 O1 j( H
</div>6 M7 i$ o" _( S3 h4 `; I
<?php endwhile;
$ }& e2 e V- X, x8 n! e wp_reset_postdata();: d$ e/ v# L4 w; j& i
endif;
) y5 _/ j9 g% V% _# Z" m ```2 b, D, g K8 L" I; _, G
) G) ?) ?, t% I$ @
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|