|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
: {( z% s# t3 U, H
& Y3 t) a2 C, [6 g" R7 P/ v" f如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
" c: U T p! ]: e. Q, u1 Q+ N2 y1 a! ]
以下是创建自定义插件的步骤:) i8 `4 K, V9 }
9 o' Z+ k; C0 x6 r9 x
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:4 H, c2 a/ v+ N9 F2 Q/ g5 M, |) _
+ r; U5 ^/ g7 p' u4 q3 R6 I
```4 _8 \" b; e: G/ V5 n+ t8 A
<?php6 I3 b& v) E) U3 \/ Q
/*: ?2 }7 W" }7 e5 w i
Plugin Name: Site Wide Notices Plugin6 T, a( O' ~6 _* S6 x
Description: Adds a new custom post type for site-wide notices.+ ]6 M5 Y6 t. k/ u7 C3 m7 _* N
Version: 1.0
$ y5 ~2 U- d8 r Author: Your Name( x! e' ?6 F i& m9 b( ]
Author URI: http://example.com
7 R7 L; }5 G1 B# B. G' V. k2 { */
1 u M. L: @! t/ B" v2 ^8 v
" M1 R9 i* Q B0 ~ // Add plugin code here...
$ j5 C0 m* w- a& U" n2 X ```" l% {5 x; W+ x9 z7 Y
( K# k% Q. g! T! F2 z' C 在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。6 f8 g$ A; g& p; c6 H# G9 j
: j7 B7 [+ r3 D7 P: N
2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:% @+ O: M) S5 O- H# k- n
5 c8 M0 ~$ L6 p n ```7 m& D" A! f, F Z
add_action('init', 'create_custom_post_type');
: w/ [# M/ a* \8 g m, ~# _% ` function create_custom_post_type() {
H* ]& d# ]0 u# y& n6 U $labels = array( K& @4 I2 R6 K7 B8 }
'name' => 'Site Wide Notices',
- H; I N3 U* {3 A; F8 v 'singular_name' => 'Site Wide Notice',0 Q) U) [4 I ^: a
'add_new' => 'Add New',
' T5 q# I" g% v' O! c/ }/ { 'add_new_item' => 'Add New Site Wide Notice',
8 O9 l0 Q* O4 y" t6 g2 b 'edit_item' => 'Edit Site Wide Notice',; j' ^8 _4 S8 l b- K/ L: z& [
'new_item' => 'New Site Wide Notice',1 {5 |8 l& L/ e# F5 k9 |
'view_item' => 'View Site Wide Notice',0 @, g }0 f" ?) K u) Z* i
'search_items' => 'Search Site Wide Notices',
. J7 T4 G" O3 u1 |+ l 'not_found' => 'No site-wide notices found',5 k; D0 H1 X; T; Z
'not_found_in_trash' => 'No site-wide notices found in trash'
" m2 Y, a/ p+ \0 g0 o/ F9 ^ );( Y% l! j9 s' `: i6 P$ C" E
# T: W& t/ u4 V $args = array(
" B! H- w5 H6 }# i 'labels' => $labels,5 h8 M- f0 S* r8 R
'public' => true,6 l5 X; Z* h" W/ N5 R4 w+ c
'has_archive' => true,
5 ~$ J$ e& S& |$ P 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),$ C S! g/ ^; F9 c
'taxonomies' => array('category', 'post_tag'),8 |' R3 _% U8 G6 J9 v) F
'menu_icon' => 'dashicons-megaphone',& T9 R3 P% e, q1 D. {) y' m
'menu_position' => 5, ^% b2 T7 t0 h
'rewrite' => array('slug' => 'site-wide-notices')$ z8 ] L0 ]( c: q+ |2 k
);
7 Y* K O& K) B) y) `
, X& x/ m0 Y, ], b! C/ X register_post_type('site-wide-notices', $args);+ o& u5 l3 Y6 D: ]* f, {
}7 R8 L Y8 Z. F* @
```! S& v4 B, E7 [& K+ J: }
8 Z" V" t6 B( x# A- u 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。( g7 {& l6 i& m" i* Q
+ R+ P4 A0 [6 a3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
! W! p- L! _) U: _; R) f6 `7 K) j% m
" \' m* `( V# |) P6 B( b- Y K ```1 A8 D" P! N, h. l
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
; w2 F/ o1 X2 w function add_site_wide_notices_boxes() {
1 t$ Y, h% e: J4 \; e1 d3 P add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');% j* [# ]! v* W. X7 `, J
}
! i& I: U$ F' Z% Y, [$ o! A4 @% s) _" C
function notice_details_meta_box($post) {
) B3 J4 k/ u" K+ D$ ?8 s wp_nonce_field(basename(__FILE__), 'notices_nonce');
' ^: X! B% y& W $notice_title = get_post_meta($post->ID, 'notice_title', true);
& Y3 r J9 [3 ] $notice_content = get_post_meta($post->ID, 'notice_content', true);
( |+ p t- V4 H a' _7 n ?>+ R( I/ q8 h4 S
<p> V" r8 m$ R% C ?- H
<label for="notice-title">Notice Title</label><br>9 M+ v. i: B! q' D; C" r
<input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
( p% k& _: u1 R3 | </p>
3 b) o. W+ X9 u8 M A H <p>
. _1 r+ r% i, B/ n& f/ S. H0 q <label for="notice-content">Notice Content</label><br>& f1 } O1 _1 \) h, ?' h2 S
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>* E- @( L8 g; S$ }! l0 X
</p>$ I P9 S4 T9 I! `) a" _% R; D
<?php
3 @6 J: y7 K* t5 B }
; H7 u W* a5 W! U( p
, N8 u0 x1 K4 a* a add_action('save_post', 'save_site_wide_notice_meta_box');
) O/ B, A# u* v% Z! g function save_site_wide_notice_meta_box($post_id) {
; K$ g6 n8 p" g% P if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))
4 f% Z& `' C# Z2 X: { return;
2 |1 ?8 g5 |( [+ v( [8 Q% r if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
8 ^/ v) F# }0 c6 R, z+ V return;
3 {1 ]/ |0 I/ _! [ r/ ^: R9 j! Y1 m
if (isset($_POST['notice_title'])) {
8 k7 a/ e/ b0 f. J) p update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));% u+ y! \; S$ p9 E5 m* |
}' ]" q: a7 p7 I) G |
if (isset($_POST['notice_content'])) {
" h! T. \; l, Y- Z update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));
7 R) J# e2 e. K- p" c |1 b8 [# Z }
' Q7 Y0 n1 X4 `2 e }6 B( w) x1 V& l5 a5 V9 g& n
```/ w" r$ D2 y& t) e
0 ?3 v" O3 D, D1 ^5 W
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。9 l9 ~, {$ d1 G5 U. S4 z
: n6 g* [3 |1 y; l
4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告: C, F# ~2 e' b" C9 _
4 i: Y( i% m% b$ e g! M
```
) b; J( X; l8 C: s $args = array(
D' R* J& A. z1 _9 M- y 'post_type' => 'site-wide-notices',
6 l$ O+ b- y2 n1 v$ X% } 'posts_per_page' => 3,3 a: e% g0 D- ?# P6 M; F
'order' => 'DESC',
3 ^1 v$ D( r! ^3 v 'orderby' => 'date'
4 m: ~; ^& X5 b0 R* L. ~ );8 m6 w; J) q* e, Q, g4 p
$query = new WP_Query($args);3 e' G& i9 p7 ^# D( A: _# }3 Y# Z
if ($query->have_posts()) :' a# F+ N7 r: a" @6 n. V6 R
while ($query->have_posts()) : $query->the_post(); ?>3 x% v# _9 ^. _0 C$ Z
<div class="notice">; S* C! W9 J; |- g) p3 ^
<h3><?php the_title(); ?></h3>
& N+ X2 p# r( W! P <div class="notice-content"><?php the_content(); ?></div>
: D; Y/ y- v8 D' X) i2 y </div>
3 ^' m1 @4 I, X ` <?php endwhile;2 e. u' H# x5 k# c3 v) i
wp_reset_postdata();
) \3 Y% \6 e, l* Y1 w2 k( Z0 }& V endif; r/ C: G& g+ W- e) f$ S6 l8 p, I' m
```
4 y5 H3 E. j* ~1 o) k
7 ^" k" E# }4 j2 ^ 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|