|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
6 U) A4 D, ~$ _6 Q
5 J* J2 z% F* I6 ~! r ~如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。* q8 [; O, L4 b! E8 y K
0 I7 g1 b( i4 `& J# `( `以下是创建自定义插件的步骤:
# @% V+ Y R, Y2 q4 B8 {
- o" o8 C# ~$ d1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:
2 e0 t! c$ ?! }6 \$ w8 O
; E2 S# K4 w M4 A4 J ```% \- b' ]6 @: @/ F. s
<?php1 K, w" D: w. c* ]8 @: y/ w. ?3 ~
/*
8 M3 `) m1 r. H9 M/ B% f Plugin Name: Site Wide Notices Plugin
k) O: E2 A3 C+ Q: |( w( v Description: Adds a new custom post type for site-wide notices. }2 n8 C1 w2 v9 w1 h! a$ F; O
Version: 1.0. p v. M- @* r! z9 w* T, c& F
Author: Your Name
u9 n" U: P9 I! \# W Author URI: http://example.com7 |/ n# A$ U/ t/ h2 c4 j
*/ w0 \, ^9 \" F: A3 x
) D \" E$ O3 Y' }" K% Y$ p; A+ h // Add plugin code here...) g O& C0 T {5 B4 C' Y; j
```
1 F) K5 ~9 Y# v: x9 x. p, |5 j6 z6 {. R; H
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。) e2 N- C" V; E) ?; V, E* P5 R
. o' a3 s& `; G7 M2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:
5 @( _# ]8 ?. J+ ?5 c1 h' D2 J! \5 v( d1 _$ g2 T
```4 T% a7 m' v g O- c
add_action('init', 'create_custom_post_type');
7 ]* W4 b4 S0 _9 L) U function create_custom_post_type() {
6 r. U& N: O; y% G& O7 l9 m- W $labels = array(+ O: i) u5 S; l j) g
'name' => 'Site Wide Notices',& y4 \* ^* s- m, {- W
'singular_name' => 'Site Wide Notice',$ o6 B. b/ d$ ~. \
'add_new' => 'Add New',
; x8 u# N' t. ^0 w 'add_new_item' => 'Add New Site Wide Notice',' {) i0 T) J4 u" \
'edit_item' => 'Edit Site Wide Notice',, a7 P' O( b0 ?0 B: ?6 [
'new_item' => 'New Site Wide Notice',. y0 J5 a- M8 v. ~/ `5 G8 J4 i
'view_item' => 'View Site Wide Notice',
4 k- q- B. s: v0 H. i0 c$ g f, b 'search_items' => 'Search Site Wide Notices',% `2 h/ M2 ?* R3 `# O9 h# M
'not_found' => 'No site-wide notices found',6 A1 ^+ |2 Y) b# z2 f0 `
'not_found_in_trash' => 'No site-wide notices found in trash'/ t8 B6 f+ S! V
);
4 J' }5 s7 [4 J
1 z" ?' E8 b/ c* g0 I3 |+ M $args = array(& ?5 d0 _5 H! R) O' H3 A7 {0 p
'labels' => $labels,/ n, O6 ^3 _& J
'public' => true,6 j' Y0 X. ^: I; y+ {8 M% b
'has_archive' => true,
$ E/ Z$ I, @- W- f 'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
$ }% q: D: F) M1 `* k# ^+ y 'taxonomies' => array('category', 'post_tag'),
8 I3 e- x# Z. ~3 k7 r& i, J 'menu_icon' => 'dashicons-megaphone',
8 f( ?" O% Y. \7 {( D 'menu_position' => 5,% D! Y7 K+ p1 S* D
'rewrite' => array('slug' => 'site-wide-notices')+ q2 q3 O/ R: e0 u
);" z T6 g# ]4 y
7 }1 q" @- ~: d2 [5 }
register_post_type('site-wide-notices', $args);
5 j( H( N- h$ o9 L! @* N8 v8 s }
|$ q7 `1 \4 S( y ```" P) K6 e8 w( j; U
& w% m+ E, B3 y' p/ I Y3 m 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。& h: e6 a& _; e5 w
- g4 J+ W& l6 O+ w- Q3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:
7 N- w+ N G' u) @# ]% r S
3 h# r3 t0 V$ d" F3 h ```% @7 l( ^# u3 o/ \; P
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
! E! t) u" H* h! ]/ v. w; W function add_site_wide_notices_boxes() {
# M2 y/ O* W$ Z, x add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');* v) ? L: [: s& j1 \1 f
}1 @+ }6 ]6 H7 g+ e( v
4 ~* ?1 p1 b+ j2 }( y function notice_details_meta_box($post) {1 u0 E) o- ~" a' }" {$ `( J/ I) Q
wp_nonce_field(basename(__FILE__), 'notices_nonce');$ |, K+ y' E# E' q0 C3 g
$notice_title = get_post_meta($post->ID, 'notice_title', true);
: t, h/ D/ p# B. t2 W $notice_content = get_post_meta($post->ID, 'notice_content', true);7 _7 X* b' v, x' H' h0 c
?>2 j3 X$ i0 V( k, r
<p>
6 d8 y' S& J) W <label for="notice-title">Notice Title</label><br>
3 c6 H, x$ b. I5 Q8 {; [ <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
& [4 f( V- t" E2 } </p>
0 j: E3 a4 ]1 C1 K$ { <p>6 k4 v) z, v9 b2 p8 o
<label for="notice-content">Notice Content</label><br>. R5 Y( \$ D1 Q; S
<?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>
3 {$ e& H( H5 a) K </p>9 t6 B, t8 q7 S
<?php
2 f* }! w5 x2 W( y }6 z) [; I) M) ]- J5 r
0 h/ [" u% ]1 z7 r ^ add_action('save_post', 'save_site_wide_notice_meta_box'); r% [; u# F1 B; c- ?6 Y7 G
function save_site_wide_notice_meta_box($post_id) {
: q9 D, ]0 v$ h0 c g if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))5 Z* V8 b5 E/ U, m" R
return;
2 o8 A- h! q. }" M if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
! |2 ]4 S9 l6 e$ {' D3 X) p! h return;$ j) d8 I( P. M( ~
9 R& G/ s; ?6 H2 F. f6 ^ if (isset($_POST['notice_title'])) {- o, I4 Q. L1 r" o U2 K, h! Y
update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));
5 L: h' i9 D: y" M/ o4 { }
& P0 Q H3 O) D0 U, _8 k) a if (isset($_POST['notice_content'])) {
/ Z, u! v$ F7 f2 U6 E update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));1 ]0 D \$ G' c7 e7 m6 q& j: n
}
! u, s" r$ Q" V4 }; l }
( ~. M7 {, p# t" F2 ?1 P ```
) x3 E( W0 f2 S2 l: t# j0 e9 S, f6 P
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。3 Q y+ q( o0 W G2 P+ }- G
: ^, B4 e2 ?1 V$ w7 B5 ~1 P9 r4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:" V! Z9 ^. }1 o! e7 R0 ^
. [0 W; F7 K! o+ v
```. n3 i0 v$ T0 u$ [( `
$args = array(/ U' z3 W3 s- `1 z, u( Z- ]. f
'post_type' => 'site-wide-notices',) U# F' }# Y3 E+ s. T
'posts_per_page' => 3,6 q& r- x ?9 [0 P; H" L& n
'order' => 'DESC',' Z3 H R# J9 c v5 M
'orderby' => 'date'
8 L$ I" C e& [* u& a4 H& b );$ A, E) S' Y8 \# O9 @0 `
$query = new WP_Query($args);
0 n) T: Z$ N0 R4 L, k: {% x; ~ if ($query->have_posts()) :# A p/ S# {) U/ ]: U# N. `9 L
while ($query->have_posts()) : $query->the_post(); ?>& K) l& p) }/ N7 Y% e3 [
<div class="notice">- W4 x* x! K z9 @/ [6 @- `7 f8 b
<h3><?php the_title(); ?></h3>% W& Z4 B9 _, i7 Y3 M
<div class="notice-content"><?php the_content(); ?></div>: \: g0 ], c* h
</div>
- h1 H0 L; ^0 A" Y <?php endwhile;7 d0 e$ @$ @, d) A
wp_reset_postdata();# ?. K$ w/ ~ y' o
endif;" w+ c. M8 l y5 C1 O
```" `* O6 @3 M( ?7 B' ~& {) h
! ]3 A3 x: k/ X; @$ Q8 T8 ` 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|