建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

一个函数就搞定 WordPress 自定义分类选项开发(wordpress进阶教程(二十五):给菜单项添加字段)

GG网络技术分享 2025-03-18 16:12 0


一个函数就搞定 WordPress 自定义分类选项开发

上一篇我们介绍了一个函数就搞定 WordPress 自定义文章选项开发,今天继续,给大家讲解如何使用一个函数就搞定 WordPress 自定义分类选项开发,也是一个函数,非常方便快速。

WordPress 自定义分类选项是在 WordPress 后台分类新增和编辑页面,给分类添加一些字段选项来实现功能,比如分类的 SEO 标题,关键字和描述等,所以要学会快速开发 WordPress 自定义分类选项是 WordPress 二次开发必备的技能。

这次的教程会简单直接一点,原来我们都会说 WordPress 原生的开发比较麻烦,这次不再重复了,我们直接讲解怎么使用 WPJAM Basic 进行 WordPress 自定义分类选项开发,因为原生开发有点复杂,如果介绍的话,文章篇幅过长,但是我们的重点是基于 WPJAM Basic 进行二次开发,所以直接来。

使用 WPAJAM BASIC 创建自定义选项

我们继续使用一个函数就搞定 WordPress 设置页面开发里面创建的「WPJAM SEO」插件来演示怎么创建自定义分类选项页面,今天我们会创建分类的 SEO 选项,让你输入分类的 SEO 标题,关键字和描述。

直接上代码:

add_action('plugins_loaded', function(){// 所有插件都已经加载

if(!did_action('wpjam_loaded')){// 确保已加载 WPJAM Basic 插件

return;

}

wpjam_register_term_option('seo', [

'title'=> 'SEO设置',// 自定义选项标题

'list_table'=> true,// 后台分类列表页也支持设置

'page_title'=> 'SEO设置',// 分类列表点击弹窗的标题

'submit_text'=> '设置',// 弹窗的提交按钮名称

'fields'=> [

'seo_title'=> ['title'=>'SEO标题','type'=>'text','class'=>'large-text','placeholder'=>'不填则使用标题'],

'seo_description'=> ['title'=>'SEO描述','type'=>'textarea'],

'seo_keywords'=> ['title'=>'SEO关键字','type'=>'text','class'=>'large-text']

]

]);

});

代码都加了注释,懂得同学应该已经知道怎么做了,还有些困惑的同学,请听我解释 ,首先还是先确保 WPJAM Basic 已加载,这方面一个函数就搞定 WordPress 设置页面开发中已经做了详细的介绍,这里就不再赘述了。

wpjam_register_term_option

这个就是标题中说的那个牛逼的函数,是的,我们只用了 wpjam_register_term_option 这一个函数就在 WordPress 后台搞定自定义分类选项:

  • title:这个参数定义自定义选项的标题。
  • list_table:定义后台分类列表页是否也支持通过弹窗设置
  • fields:那么这个自定义选项框有哪些字段呢?就是这个参数决定的,这里定义了两个输入框和一个文本框。

和自定义文章选项不同,分类新增和编辑页面没有 meta_box 的,字段是直接展示的,所以上面代码就是在分类列表和编辑页新增三个字段,分别是「SEO标题」,「SEO描述」和「SEO关键字」,我截图一下新增页面的字段:

然后在分类列表页右侧的分类列表也可以进行设置操作:

点击上面「SEO设置」按钮也可以进行同样的设置:

在页面上使用自定义分类选项

创建了选项之后,那么我们就要把他们用起来,WordPress 提供了获取分类自定义字段的函数:

get_term_meta($term_id, $met_key, $single);// 获取分类自定义字段

首先把在分类/标签/自定义分类页将页面标题改成上面定义的「SEO标题」:

add_filter('document_title', function($title){

if((is_category() || is_tag() || is_tax()) && get_query_var('paged') < 2){

return get_term_meta(get_queried_object_id(), 'seo_title', true) ?: $title;

}

return $title;

});

然后把「SEO描述」和「SEO关键字」输出到分类/标签/自定义分类页的 head 中:

add_action('wp_head', function(){

if((is_category() || is_tag() || is_tax()) && get_query_var('paged') < 2){// 分类/标签/自定义分类页并且第一页

foreach(['description', 'keywords'] as $type){

if($meta_value = get_term_meta(get_queried_object_id(), 'seo_'.$type, true)){

echo "<meta name='{$type}' content='{$meta_value}' />\\n";// 只有设置才输出

}

}

}

});

就是这么简单,如果你是 WordPress 主题或者插件开发者,使用 WPJAM Basic 进行二次开发都是超简单的一件事情,我会把二次开发做成一个专题,下篇教程预告:一个函数搞定 WordPress 自定义分类列表自定义栏目开发

wordpress进阶教程(二十五):给菜单项添加字段

我们知道1、wordpress的文章有个自定义字段,而且在本工作室前面的教程中也有关于添加自定义字段的教程和类文件。2、wordpress的菜单也是“某一个文章类型”,类型名为nav_menu_item,可以参考:wordpress进阶教程(一):wordpress文章类型,每一个菜单项是“一篇文章”,每一个菜单就是“一个分类”,分类法为nav_menu。

申明:本文中的代码搜集自互联网。

那么在wordpress中,菜单也可以添加自定义字段。

菜单在后台的显示代码在wp-admin/includes/nav-menu.php文件中,在类Walker_Nav_Menu_Edit很容易在里面找到后台菜单项的显示代码,但是寻找后发现,代码中并没有提供过滤器或者动作钩子。

方法:

一、将wp-admin/includes/nav-menu.php文件中Walker_Nav_Menu_Edit类复制一份粘贴到主题functions.php文件中,更改类名,然后在里面添加相应的代码。如下:

  1. class Walker_Nav_Menu_Edit_Custom extends Walker_Nav_Menu {
  2.     /**
  3.      * @see Walker_Nav_Menu::start_lvl()
  4.      * @since 3.0.0
  5.      *
  6.      * @param string $output Passed by reference.
  7.      */
  8.     function start_lvl(&$output) {}
  9.     /**
  10.      * @see Walker_Nav_Menu::end_lvl()
  11.      * @since 3.0.0
  12.      *
  13.      * @param string $output Passed by reference.
  14.      */
  15.     function end_lvl(&$output) {
  16.     }
  17.     /**
  18.      * @see Walker::start_el()
  19.      * @since 3.0.0
  20.      *
  21.      * @param string $output Passed by reference. Used to append additional content.
  22.      * @param object $item Menu item data object.
  23.      * @param int $depth Depth of menu item. Used for padding.
  24.      * @param object $args
  25.      */
  26.     function start_el(&$output$item$depth$args) {
  27.         global $_wp_nav_menu_max_depth;
  28.         $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
  29.         $indent = ( $depth ) ? str_repeat\"\\t\"$depth ) : \'\';
  30.         ob_start();
  31.         $item_id = esc_attr( $item->ID );
  32.         $removed_args = array(
  33.             \'action\',
  34.             \'customlink-tab\',
  35.             \'edit-menu-item\',
  36.             \'menu-item\',
  37.             \'page-tab\',
  38.             \'_wpnonce\',
  39.         );
  40.         $original_title = \'\';
  41.         if ( \'taxonomy\' == $item->type ) {
  42.             $original_title = get_term_field( \'name\', $item->object_id, $item->object, \'raw\' );
  43.             if ( is_wp_error( $original_title ) )
  44.                 $original_title = false;
  45.         } elseif ( \'post_type\' == $item->type ) {
  46.             $original_object = get_post( $item->object_id );
  47.             $original_title = $original_object->post_title;
  48.         }
  49.         $classes = array(
  50.             \'menu-item menu-item-depth-\' . $depth,
  51.             \'menu-item-\' . esc_attr( $item->object ),
  52.             \'menu-item-edit-\' . ( ( isset( $_GET[\'edit-menu-item\'] ) && $item_id == $_GET[\'edit-menu-item\'] ) ? \'active\' : \'inactive\'),
  53.         );
  54.         $title = $item->title;
  55.         if ( ! empty$item->_invalid ) ) {
  56.             $classes[] = \'menu-item-invalid\';
  57.             /* translators: %s: title of menu item which is invalid */
  58.             $title = sprintf( __( \'%s (Invalid)\' ), $item->title );
  59.         } elseif ( isset( $item->post_status ) && \'draft\' == $item->post_status ) {
  60.             $classes[] = \'pending\';
  61.             /* translators: %s: title of menu item in draft status */
  62.             $title = sprintf( __(\'%s (Pending)\'), $item->title );
  63.         }
  64.         $title = empty$item->label ) ? $title : $item->label;
  65.         ?>
  66.         <li id=\"menu-item-<?php echo $item_id; ?>\" class=\"<?php echo implode(\' \', $classes ); ?>\">
  67.             <dl class=\"menu-item-bar\">
  68.                 <dt class=\"menu-item-handle\">
  69.                     <span class=\"item-title\"><?php echo esc_html( $title ); ?></span>
  70.                     <span class=\"item-controls\">
  71.                         <span class=\"item-type\"><?php echo esc_html( $item->type_label ); ?></span>
  72.                         <span class=\"item-order hide-if-js\">
  73.                             <a href=\"<?php
  74.                                 echo wp_nonce_url(
  75.                                     add_query_arg(
  76.                                         array(
  77.                                             \'action\' => \'move-up-menu-item\',
  78.                                             \'menu-item\' => $item_id,
  79.                                         ),
  80.                                         remove_query_arg($removed_args, admin_url( \'nav-menus.php\' ) )
  81.                                     ),
  82.                                     \'move-menu_item\'
  83.                                 );
  84.                             ?>\" class=\"item-move-up\"><abbr title=\"<?php esc_attr_e(\'Move up\'); ?>\">↑</abbr></a>
  85.                             |
  86.                             <a href=\"<?php
  87.                                 echo wp_nonce_url(
  88.                                     add_query_arg(
  89.                                         array(
  90.                                             \'action\' => \'move-down-menu-item\',
  91.                                             \'menu-item\' => $item_id,
  92.                                         ),
  93.                                         remove_query_arg($removed_args, admin_url( \'nav-menus.php\' ) )
  94.                                     ),
  95.                                     \'move-menu_item\'
  96.                                 );
  97.                             ?>\" class=\"item-move-down\"><abbr title=\"<?php esc_attr_e(\'Move down\'); ?>\">↓</abbr></a>
  98.                         </span>
  99.                         <a class=\"item-edit\" id=\"edit-<?php echo $item_id; ?>\" title=\"<?php esc_attr_e(\'Edit Menu Item\'); ?>\" href=\"<?php
  100.                             echo ( isset( $_GET[\'edit-menu-item\'] ) && $item_id == $_GET[\'edit-menu-item\'] ) ? admin_url( \'nav-menus.php\' ) : add_query_arg( \'edit-menu-item\', $item_id, remove_query_arg( $removed_args, admin_url( \'nav-menus.php#menu-item-settings-\' . $item_id ) ) );
  101.                         ?>\"><?php _e( \'Edit Menu Item\' ); ?></a>
  102.                     </span>
  103.                 </dt>
  104.             </dl>
  105.             <div class=\"menu-item-settings\" id=\"menu-item-settings-<?php echo $item_id; ?>\">
  106.                 <?php if( \'custom\' == $item->type ) : ?>
  107.                     <p class=\"field-url description description-wide\">
  108.                         <label for=\"edit-menu-item-url-<?php echo $item_id; ?>\">
  109.                             <?php _e( \'URL\' ); ?><br />
  110.                             <input type=\"text\" id=\"edit-menu-item-url-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-url\" name=\"menu-item-url[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->url ); ?>\" />
  111.                         </label>
  112.                     </p>
  113.                 <?php endif; ?>
  114.                 <p class=\"description description-thin\">
  115.                     <label for=\"edit-menu-item-title-<?php echo $item_id; ?>\">
  116.                         <?php _e( \'Navigation Label\' ); ?><br />
  117.                         <input type=\"text\" id=\"edit-menu-item-title-<?php echo $item_id; ?>\" class=\"widefat edit-menu-item-title\" name=\"menu-item-title[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->title ); ?>\" />
  118.                     </label>
  119.                 </p>
  120.                 <p class=\"description description-thin\">
  121.                     <label for=\"edit-menu-item-attr-title-<?php echo $item_id; ?>\">
  122.                         <?php _e( \'Title Attribute\' ); ?><br />
  123.                         <input type=\"text\" id=\"edit-menu-item-attr-title-<?php echo $item_id; ?>\" class=\"widefat edit-menu-item-attr-title\" name=\"menu-item-attr-title[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->post_excerpt ); ?>\" />
  124.                     </label>
  125.                 </p>
  126.                 <p class=\"field-link-target description\">
  127.                     <label for=\"edit-menu-item-target-<?php echo $item_id; ?>\">
  128.                         <input type=\"checkbox\" id=\"edit-menu-item-target-<?php echo $item_id; ?>\" value=\"_blank\" name=\"menu-item-target[<?php echo $item_id; ?>]\"<?php checked( $item->target, \'_blank\' ); ?> />
  129.                         <?php _e( \'Open link in a new window/tab\' ); ?>
  130.                     </label>
  131.                 </p>
  132.                 <p class=\"field-css-classes description description-thin\">
  133.                     <label for=\"edit-menu-item-classes-<?php echo $item_id; ?>\">
  134.                         <?php _e( \'CSS Classes (optional)\' ); ?><br />
  135.                         <input type=\"text\" id=\"edit-menu-item-classes-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-classes\" name=\"menu-item-classes[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( implode(\' \', $item->classes ) ); ?>\" />
  136.                     </label>
  137.                 </p>
  138.                 <p class=\"field-xfn description description-thin\">
  139.                     <label for=\"edit-menu-item-xfn-<?php echo $item_id; ?>\">
  140.                         <?php _e( \'Link Relationship (XFN)\' ); ?><br />
  141.                         <input type=\"text\" id=\"edit-menu-item-xfn-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-xfn\" name=\"menu-item-xfn[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->xfn ); ?>\" />
  142.                     </label>
  143.                 </p>
  144.                 <p class=\"field-description description description-wide\">
  145.                     <label for=\"edit-menu-item-description-<?php echo $item_id; ?>\">
  146.                         <?php _e( \'Description\' ); ?><br />
  147.                         <textarea id=\"edit-menu-item-description-<?php echo $item_id; ?>\" class=\"widefat edit-menu-item-description\" rows=\"3\" cols=\"20\" name=\"menu-item-description[<?php echo $item_id; ?>]\"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>
  148.                         <span class=\"description\"><?php _e(\'The description will be displayed in the menu if the current theme supports it.\'); ?></span>
  149.                     </label>
  150.                 </p>
  151.                 <?php
  152.                 /*
  153.                 * 嘿,下面是自己添加的代码,注意里面的字符 ashuwp
  154.                 */
  155.                 ?>
  156.                 <p class=\"field-ashuwp description description-wide\">
  157.                     <label for=\"edit-menu-item-ashuwp-<?php echo $item_id; ?>\">wp自学笔记<br />
  158.                     <input type=\"text\" id=\"edit-menu-item-ashuwp-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-ashuwp\" name=\"menu-item-ashuwp[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->ashuwp ); ?>\" />
  159.                     </label>
  160.                     </p>
  161.                 <?php
  162.                 /*
  163.                 * 自己添加的代码结束,你可以继续添加其他的字段代码
  164.                 */
  165.                 ?>
  166.                 <div class=\"menu-item-actions description-wide submitbox\">
  167.                     <?php if( \'custom\' != $item->type && $original_title !== false ) : ?>
  168.                         <p class=\"link-to-original\">
  169.                             <?php printf( __(\'Original: %s\'), \'<a href=\"\' . esc_attr( $item->url ) . \'\">\' . esc_html( $original_title ) . \'</a>\' ); ?>
  170.                         </p>
  171.                     <?php endif; ?>
  172.                     <a class=\"item-delete submitdelete deletion\" id=\"delete-<?php echo $item_id; ?>\" href=\"<?php
  173.                     echo wp_nonce_url(
  174.                         add_query_arg(
  175.                             array(
  176.                                 \'action\' => \'delete-menu-item\',
  177.                                 \'menu-item\' => $item_id,
  178.                             ),
  179.                             remove_query_arg($removed_args, admin_url( \'nav-menus.php\' ) )
  180.                         ),
  181.                         \'delete-menu_item_\' . $item_id
  182.                     ); ?>\"><?php _e(\'Remove\'); ?></a> <span class=\"meta-sep\"> | </span> <a class=\"item-cancel submitcancel\" id=\"cancel-<?php echo $item_id; ?>\" href=\"<?php echo esc_url( add_query_arg( array(\'edit-menu-item\' => $item_id, \'cancel\' => time()), remove_query_arg( $removed_args, admin_url( \'nav-menus.php\' ) ) ) );
  183.                         ?>#menu-item-settings-<?php echo $item_id; ?>\"><?php _e(\'Cancel\'); ?></a>
  184.                 </div>
  185.                 <input class=\"menu-item-data-db-id\" type=\"hidden\" name=\"menu-item-db-id[<?php echo $item_id; ?>]\" value=\"<?php echo $item_id; ?>\" />
  186.                 <input class=\"menu-item-data-object-id\" type=\"hidden\" name=\"menu-item-object-id[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->object_id ); ?>\" />
  187.                 <input class=\"menu-item-data-object\" type=\"hidden\" name=\"menu-item-object[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->object ); ?>\" />
  188.                 <input class=\"menu-item-data-parent-id\" type=\"hidden\" name=\"menu-item-parent-id[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->menu_item_parent ); ?>\" />
  189.                 <input class=\"menu-item-data-position\" type=\"hidden\" name=\"menu-item-position[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->menu_order ); ?>\" />
  190.                 <input class=\"menu-item-data-type\" type=\"hidden\" name=\"menu-item-type[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->type ); ?>\" />
  191.             </div><!-- .menu-item-settings-->
  192.             <ul class=\"menu-item-transport\"></ul>
  193.         <?php
  194.         $output .= ob_get_clean();
  195.     }
  196. }

标签:

提交需求或反馈

Demand feedback