|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
0 G9 O9 W" y# n. T# m9 e
/ R: A' `# W0 p7 }3 h3 ?8 z* N如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
. r# |1 B3 o& n# y& S/ S3 R2 g2 i, Q+ w% ]+ h
以下是创建自定义插件的步骤:
4 n0 J8 g" S g1 d! E# V
# i6 R6 l- Y J* l1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:, a5 i6 y, c- s# T% t6 S$ d3 M
. C4 ]% {8 }6 ?- E0 Y ```! F, B9 w- _6 h( P2 v# ]9 G0 k2 E o" O
<?php
: G' j9 B9 R1 @* D p/ ~ /*
( P9 }) F7 l" Q% f$ ?# X& e Plugin Name: Site Wide Notices Plugin
N, }+ Q, J' N% A- d( e6 D Description: Adds a new custom post type for site-wide notices.9 W! M) g" K" e# S& b7 ^) Q
Version: 1.0
y% s4 j; n, e2 H" [ b4 X Author: Your Name* x# w2 i7 F8 h. c/ T
Author URI: http://example.com2 m1 s8 @0 s9 ?- R
*/
% A, t# \( N$ \) H6 ?
% g0 n' Y9 a& t1 v# F4 y$ g* } // Add plugin code here...
5 g- ?: m. A, f* W/ l3 J ```
; T( p4 \# T& f* Q8 \; J7 I n2 t" q
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。' x1 J# w5 z8 l4 d p# I
) a5 b& w5 o' r8 j) X* i- q) I1 _2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
) k8 K% r! j) q! a; y l) C: W( d. v6 B$ w) D
```
9 f% u# s3 X4 R0 V6 u9 _ add_action('init', 'create_custom_post_type');: @* o- {/ f o+ S* @! I
function create_custom_post_type() {1 N1 e+ N u/ i1 h2 z* z5 q* T
$labels = array(
! K0 N& X9 ~0 N! w* K 'name' => 'Site Wide Notices',
. X v& {2 b1 C' w! P. G7 x5 h 'singular_name' => 'Site Wide Notice',
# r6 [ T4 m% |" S 'add_new' => 'Add New',
2 T/ B9 A9 D2 D |5 p( a+ O1 P 'add_new_item' => 'Add New Site Wide Notice',
7 {: z8 V' w/ Z 'edit_item' => 'Edit Site Wide Notice',
* ]+ }3 I) f: _- b; ]6 w 'new_item' => 'New Site Wide Notice',
2 n' l ]7 D8 x* p% O 'view_item' => 'View Site Wide Notice',
( l( @" b* }3 F4 T9 ^& u 'search_items' => 'Search Site Wide Notices',
1 g( n; L+ E% Q( F 'not_found' => 'No site-wide notices found',
) e) @* ~9 h7 b: f. | 'not_found_in_trash' => 'No site-wide notices found in trash'6 H+ J5 Q6 ~! O5 B" r; s1 N. V7 H
);- p# Q w8 w3 C, [
h" G) E3 \5 _; a6 K( ?+ ] $args = array(
& U, w4 r6 J* D1 X# Q( g 'labels' => $labels,
( x, S! _" N$ D2 M# X E! N 'public' => true,
# }: ~" u. b/ n" x 'has_archive' => true,& a9 ?( W6 ]+ n3 z
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
* T8 o& `' A& |5 v3 L) l# o 'taxonomies' => array('category', 'post_tag'),1 ?5 S+ n4 ?% y
'menu_icon' => 'dashicons-megaphone',
/ C* q. u. h" a1 H* S0 e0 m 'menu_position' => 5,+ y) j8 D' A0 M1 ?8 A: A
'rewrite' => array('slug' => 'site-wide-notices')
% e* v3 R% P( v* O/ l, d8 ~! _ );. I' v5 E" o5 K& f# u/ b7 ~
$ U7 C- `/ y, h) Q8 g1 ]
register_post_type('site-wide-notices', $args);8 H1 a7 M3 t5 U: y0 e
}
5 J: i3 T; }) ?' i0 t ```
4 r* \; |. U8 J. Z
1 G! v! D) l5 ?$ M 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。+ p) a. f& e3 ]3 b& g6 D& {- }
& ^; }" a8 ~. y" i3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
- I1 a: y5 M/ B8 Y3 p* ]# R) B+ u; W7 L% o* E+ Y/ A- Z( v# L
```
/ G/ _! m5 H; _. j8 N( V4 J+ t4 }/ n add_action('add_meta_boxes', 'add_site_wide_notices_boxes');! Z1 i* X8 n0 U0 A# S
function add_site_wide_notices_boxes() {
, W) l1 W k# M4 X! p7 A1 c add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');8 b! z3 Q& e+ |
}/ A; D2 X/ o) T2 N- Q" G- e
5 j8 k/ C8 \; [4 o
function notice_details_meta_box($post) {
: p; n' O) I9 t! D/ @5 j& K wp_nonce_field(basename(__FILE__), 'notices_nonce');
9 F1 c7 v( K) J) G* j4 n) S $notice_title = get_post_meta($post->ID, 'notice_title', true);" ~- h1 w. K1 A6 w* W) o
$notice_content = get_post_meta($post->ID, 'notice_content', true);
: Q8 K: [3 O; u' B ?>
- M* `5 L3 |0 R <p>7 y j: p3 f# h9 _2 f
<label for="notice-title">Notice Title</label><br>3 {5 @2 ~& ]' o" ]
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">9 I, `% g! W6 Z4 N/ n& ?% }
</p>) Q9 R" p' D W8 Y* a( Y/ s2 d
<p>& }: l" g/ p% g; N& M
<label for="notice-content">Notice Content</label><br>9 g+ s. G# ^5 F- V. X
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>' R0 l0 B1 K/ H0 s0 K- D: j
</p>! y) u8 [5 j2 Z4 l6 Y+ [. U
<?php! p! {# Z" T# H7 d6 b
}2 p' ^/ M3 C0 p$ l4 f9 D. O; F( L
# H( J9 W) H A0 C2 `& S$ N0 ] add_action('save_post', 'save_site_wide_notice_meta_box');* v3 O L4 i# {
function save_site_wide_notice_meta_box($post_id) {
0 s4 R( Q( p7 K/ K7 b if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))0 r5 Z: a, ], o4 x- I- M: D7 @( m
return;; X8 J# P K* {/ s# T: I
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
* M' C6 U: c* a3 S9 n& b4 J# R return;- ?+ |* K8 z$ t" S" E" C9 s
9 ]4 k& {) I$ Z5 u6 u
if (isset($_POST['notice_title'])) {4 h( J! E! A. v4 w; ?9 l
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
. e' G( V- t! G( v }
8 ^6 Y, X; V* N3 ] if (isset($_POST['notice_content'])) { {1 x* R+ |; `) K! e& T3 P
update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));* i h+ i! D$ C
}
( B: ~1 }, W: T8 N2 g6 h }2 F- T% d2 U) R# x* p8 x7 d8 Q
```
5 n/ E1 J2 K3 j. a7 B6 h9 Q' y. P# ~7 ?2 C2 a5 C: t9 L9 `
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。) { ?$ y! L4 k8 ]" m1 y" u
7 D8 \+ a7 w* r M4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:
+ e2 {! F" t( t$ |4 c6 x: p) _/ q+ x [3 n
```
* Z$ q9 L% Y9 M0 ] $args = array(4 r" q0 F% @: o3 n
'post_type' => 'site-wide-notices',! u3 P7 s6 J- c/ c$ U
'posts_per_page' => 3,
7 j, y1 a8 F% \! z 'order' => 'DESC',6 U+ n7 V" p b! }+ e
'orderby' => 'date'" w! Z: u0 _& U/ w8 [* S" b# u; S
);3 E% y, P8 c# N; \1 o6 F1 L7 K
$query = new WP_Query($args);3 v- g) d! T* m1 r% [: Y/ @
if ($query->have_posts()) :2 z8 ], r5 o. W7 O
while ($query->have_posts()) : $query->the_post(); ?>( v- `1 E/ [' V# Q, ?8 ^% T- M
<div class="notice">" B2 R, T# x' h4 _* ]( v) n. ?
<h3><?php the_title(); ?></h3>
% T, x! w0 v& A0 ]' e, R5 |+ R <div class="notice-content"><?php the_content(); ?></div>
% S0 o6 ^1 b6 ^& p, x% f </div>/ I" i% x; z) y8 q- l
<?php endwhile;# b: `# Y8 ^ ]* I% l0 L S. N
wp_reset_postdata();
# V0 _$ O( j6 f endif;
1 Q; y# \) r" T. ~* l ```& L( ?" o) W+ y4 s
$ E" Y+ `- T+ s/ F! w& N
在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|