|
|
楼主 |
发表于 2023-5-18 09:27:55
来自手机
|
显示全部楼层
如果不想修改functions.php,有其他更好的办法吗?
6 |/ V3 ]1 r7 R: \" U1 o1 n. p- B$ j7 u6 j* {
如果您不想修改主题 `functions.php` 文件,也可以创建一个自定义插件来添加新的文章类型。
H6 X9 I8 k ~/ t
: t$ ^! {: u5 M3 f4 G以下是创建自定义插件的步骤: J- z& H1 h: ?( o- }( {( q
9 J/ a( P* r6 `% J. d
1. 创建新插件:在 WordPress 插件目录中创建一个新的子目录,例如 `site-wide-notices-plugin`,然后在该目录中创建一个新的 PHP 文件,例如 `site-wide-notices-plugin.php`,并在文件头部添加必需的标记,例如:2 C! i% R& i4 |* ~. w) U, ~$ S
' l9 m) q! R `! M( Q ```
" Q% ^" j7 c- l9 W* ?# f <?php* @+ V: O1 U- c( {) I2 C
/*
0 H; u5 @ M9 ~5 U Plugin Name: Site Wide Notices Plugin! W- c2 V/ l# H2 z3 X* P
Description: Adds a new custom post type for site-wide notices.) U& r& ` B' v4 g
Version: 1.0
$ L7 t# C0 d! n1 @/ M! T Author: Your Name
, d- C; z2 {+ Y Author URI: http://example.com5 N3 J% s0 s+ `) e$ E
*/7 d) P- d9 Z( B. ^8 M
' l9 T/ u. ~5 b* W // Add plugin code here...
: Y# i( }1 B; M' r1 O# k/ m& J ```
, c' K& a2 }2 f' g) j7 S2 d( {- u q. L% r1 `
在示例中,我们创建了一个名为 `Site Wide Notices Plugin` 的新插件,该插件添加了一个新的自定义文章类型,并指定了版本、作者和作者 URI 等元信息。- K+ D1 ]& a: V: A, O$ s) F/ e) @; ?
1 u* u# M/ T7 S1 l2. 在插件中注册新的文章类型:在 PHP 文件中添加以下代码,用于注册一个名为“site-wide-notices”的自定义文章类型:% Q& c+ C6 E- i# k9 D) ~
0 \& a9 N" z: x1 S& v) T- I ```
( j" Z3 f% h F9 q0 i3 e6 t add_action('init', 'create_custom_post_type');# P3 d1 g, ?# h- o
function create_custom_post_type() {
3 m/ h) E( v; i, }! u, F+ X! X $labels = array(
' [9 A1 s3 T2 Y7 a2 }3 T 'name' => 'Site Wide Notices'," Z& U+ R& u" u" u2 d2 W& N
'singular_name' => 'Site Wide Notice',+ C1 `" n0 ?1 A+ P
'add_new' => 'Add New',
# H9 {$ T* f$ V9 }9 h* b" B. O# \ 'add_new_item' => 'Add New Site Wide Notice',
# E: Q6 n, ^3 {0 n1 P* ]" { 'edit_item' => 'Edit Site Wide Notice',
/ ]0 w) E" o( Q8 r( t+ O 'new_item' => 'New Site Wide Notice',* m( U8 t( O6 g# |" ]" W
'view_item' => 'View Site Wide Notice',
2 A7 x% D' d" `+ ~8 X 'search_items' => 'Search Site Wide Notices',0 A( G2 x! A( k) K# w
'not_found' => 'No site-wide notices found',
+ O. @4 E7 a# l+ H9 J9 n 'not_found_in_trash' => 'No site-wide notices found in trash'
/ E9 p2 I# z3 `; _4 K$ ^: { );# q a% W2 i( z2 q
" ]- P8 P2 S2 Z6 z& [
$args = array(
7 A) |/ m" ? t/ b 'labels' => $labels,
! K' L4 G0 J+ f3 u; a* v7 q 'public' => true,' }) W) `* R* S# A
'has_archive' => true,- U* {9 I- U0 e; A$ d' G4 d
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'),
( r" ^/ e! I8 [6 l; d5 z6 g5 H 'taxonomies' => array('category', 'post_tag'),2 v4 s$ ~3 ?+ ]* F# u. F' D( Z
'menu_icon' => 'dashicons-megaphone',7 y9 e! d( T' [% g' X4 ~) @
'menu_position' => 5,, h: U/ K4 A: l
'rewrite' => array('slug' => 'site-wide-notices'). i; c( U) Y, y" _! M
);% c( C4 _! h2 E) ?4 d
* V% X" Y% V. B2 V& u8 \+ I# k
register_post_type('site-wide-notices', $args);
' f2 _# G. `- `& G5 J$ Y( [) q; i, ^* e }7 i) ]) v+ w5 Y; l. Q
```
G% s1 E$ F' p, J: {
A# x& d7 y( j4 k; p9 Q$ ?- S: c+ i 在示例中,我们使用 `register_post_type()` 函数注册一个新的文章类型,并定义了该文章类型的名称、标签和其他设置。- J- h% u( V8 Y, j9 d7 H
1 M7 T; k8 v) k( J- s
3. 在后台中添加公告编辑页面:您可以使用 `add_meta_box()` 函数在后台中添加公告编辑页面,并自定义字段和元数据,例如:7 ~# ?1 q" X h; J) J7 b
& R' E- t$ r0 h2 j! Y1 c
```% R2 e" X1 K- c6 h0 ]! P1 q8 Y
add_action('add_meta_boxes', 'add_site_wide_notices_boxes');
: \) Q, x# q7 S3 ^( T+ c# O/ E5 k function add_site_wide_notices_boxes() {
5 s1 U9 r u% V$ L" H% m! {2 m add_meta_box('notice-details', 'Notice Details', 'notice_details_meta_box', 'site-wide-notices', 'normal', 'high');
. e) J* `4 Z; ^: h6 d4 t }
- `& v% _* w: u1 a5 S) [
: k% S3 O$ F' b' K9 L* d2 M function notice_details_meta_box($post) {
4 M3 F$ V/ V- g, N( t+ G1 _1 | wp_nonce_field(basename(__FILE__), 'notices_nonce');! o/ N5 W0 q: I9 W" A2 g
$notice_title = get_post_meta($post->ID, 'notice_title', true);9 K0 K$ h( m* z& c- j; ^
$notice_content = get_post_meta($post->ID, 'notice_content', true);
7 s0 Y2 X* h' z0 H5 g6 ]+ C4 Z ?>: D1 U6 i" D+ }5 C' l
<p>4 w, B: T+ m* X3 b
<label for="notice-title">Notice Title</label><br>
) Q; u' s1 C. {0 k <input type="text" id="notice-title" name="notice_title" style="width: 100%;" value="<?php echo $notice_title; ?>">
0 Z- Y! u4 H* W3 i </p># u# M* g2 i1 R- k( X
<p>
4 @$ ?( i. }/ @8 z4 j4 X <label for="notice-content">Notice Content</label><br>
+ h. e- f* ?8 n" u <?php wp_editor($notice_content, 'notice-content', array('textarea_rows' => 10)); ?>9 r+ @7 W+ F( `2 K$ \7 F- U( c
</p>
, V- W, m6 P8 U1 J: s6 c3 f) D0 M <?php1 w0 w7 g' Y* }5 ?6 b' ~
}
, f6 I, D# F0 H5 @
# a" d) ^8 y& H! P# \1 r# Y6 p add_action('save_post', 'save_site_wide_notice_meta_box');
( F$ C8 {' Y% w8 G4 _0 g+ p' {5 I function save_site_wide_notice_meta_box($post_id) {( G6 S6 y( Y$ X5 C) j5 g. k8 N
if (!isset($_POST['notices_nonce']) || !wp_verify_nonce($_POST['notices_nonce'], basename(__FILE__)))/ {, T. z3 W' Z$ _8 A0 ]; f% G2 l
return;
/ u8 k: g3 a5 M m! H' Z' R if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)' d s6 Q5 W: H; G' o
return;5 o+ r( V. }+ s4 b0 h
5 V+ Y% k( a* f if (isset($_POST['notice_title'])) {
) Z4 w, e6 ]# B, Q update_post_meta($post_id, 'notice_title', sanitize_text_field($_POST['notice_title']));+ w) F: O" y( x, _
}
8 C" o4 p B5 @. s' v! w5 X if (isset($_POST['notice_content'])) {
! t; n3 ^" J( j _% ? update_post_meta($post_id, 'notice_content', wp_kses_post($_POST['notice_content']));6 [; K$ O6 s, | t4 J
}
& C( l4 E. o( h- j" I }' \2 U' L! _# V+ }
```
% C. O( p2 n: c/ v, w/ O# _6 x4 u7 D t3 r' J; L
在示例中,我们使用 `add_meta_box()` 函数添加了一个名为 `notice-details` 的元框,用于在编辑页面上显示自定义字段和元数据。在 `notice-details_meta_box()` 函数中,我们使用 `wp_editor()` 函数添加了一个可视化编辑器,用于编辑公告内容。在 `save_site_wide_notice_meta_box()` 函数中,我们使用 `update_post_meta()` 函数将公告标题和内容保存到 WordPress 数据库中。# D1 e9 G0 i) A5 L+ r
( x9 p* _" J) W4. 在前端页面中显示公告:在 WordPress 主题文件中添加以下代码,以在您的网站上显示公告:( ]5 G3 S% |" J b8 w4 x
$ [' {$ u& D ]' v- e. @
```
5 T: l, d6 I" z8 { Q. v $args = array(# M' K# x; \$ Z M4 f
'post_type' => 'site-wide-notices',& p5 G7 Y9 ~, j; ^; R6 O! s
'posts_per_page' => 3,
" [4 O# ^+ |6 A" ]3 X* h" T 'order' => 'DESC',
# B9 r7 e7 ]- f! c* x0 n/ H 'orderby' => 'date'# O# Y2 B& e$ f: |
);
6 p, j' @7 {/ R, X- V9 D8 z $query = new WP_Query($args);5 I7 [' @, V) [) S
if ($query->have_posts()) :
5 x* y" e4 W2 s8 R3 {% w) l while ($query->have_posts()) : $query->the_post(); ?>
1 x) U" ^3 X: I- |# C% t/ U <div class="notice">, x* t% y% D3 M* D, a
<h3><?php the_title(); ?></h3>- x& L* \. F4 C) o0 ] w; q
<div class="notice-content"><?php the_content(); ?></div>
! c7 ~. R1 ?2 X8 O3 h8 L </div>% |% T. B9 H. |+ R9 d) n0 I( J
<?php endwhile;* x2 y5 I5 \" [5 f! A! k+ O& s
wp_reset_postdata();) R) N+ |) |6 A- x5 q7 q6 z
endif; e# P1 k4 K' y# D) c1 J! u
```
; g* L" l/ R! }: j+ w) p) d5 O
2 f! X, P! A! ~6 ^& n" M 在示例中,我们使用 `WP_Query` 类从 `site-wide-notices` 文章类型中获取最近发布的 3 条公告,并在前端页面中循环遍历并显示标题和内容等信息。 |
|