当我们安装主题和插件时,都会向…
他们在网络上有太多教程来解释“如何向WordPress菜单添加自定义字段”,但是其中大多数教程都涉及如何使用默认Description字段的默认CSS字段。他们都没有提供一种向菜单中添加真正的新字段的真实方法。因此,今天我们将创建一个简单的插件,该插件将在任何WordPress菜单中添加一个“字幕”字段。
这是WordPress管理中的最终结果:
第1步:创建插件
我们去吧,正如我们在上一篇文章中所看到的,创建一个插件并不复杂。您只需要在wp-content / plugins下创建一个新文件夹并将其命名为“ sweet-custom-menu”,并在其中创建一个名为“ sweet-custom-menu.php”的文件。然后打开此文件并添加以下代码:
<?php
/*
Plugin Name: Sweet Custom Menu
Plugin URL: http://remicorson.com/sweet-custom-menu
Description: A little plugin to add attributes to WordPress menus
Version: 0.1
Author: Remi Corson
Author URI: http://remicorson.com
Contributors: corsonr
Text Domain: rc_scm
Domain Path: languages
*/
这些代码是我们定义新插件所需的全部。现在,我们将创建一个自定义PHP类,其中包含一个构造函数和使该插件正常工作所需的功能。
这是创建类的方法:
class rc_sweet_custom_menu { /*--------------------------------------------* * Constructor *--------------------------------------------*/ /** * Initializes the plugin by setting localization, filters, and administration functions. */ function __construct() { } // end constructor /* All functions will be placed here */ } // instantiate plugin's class $GLOBALS['sweet_custom_menu'] = new rc_sweet_custom_menu();
最后一行实例化该类,并将整个类添加到全局变量中。
步骤2:添加自定义字段过滤器
现在我们有了类,我们将创建自定义函数。要添加的第一个功能是将注册我们希望包含为高级菜单属性的“字幕”自定义字段的功能。为此,请在此处创建的函数而不是/ *放置此代码,所有函数都将在此处放置* /:
/**
* Add custom fields to $item nav object
* in order to be used in custom Walker
*
* @access public
* @since 1.0
* @return void
*/
function rc_scm_add_custom_nav_fields( $menu_item ) {
$menu_item->subtitle = get_post_meta( $menu_item->ID, '_menu_item_subtitle', true );
return $menu_item;
}
然后,我们需要告诉WordPress考虑我们的功能,因此将下面的代码放在__construct()函数中:
// add custom menu fields to menu
add_filter( 'wp_setup_nav_menu_item', array( $this, 'rc_scm_add_custom_nav_fields' ) );
步骤3:保存自定义字段
即使自定义的“字幕”字段实际上不存在,我们也必须创建一个函数来保存其在菜单版本中的值。菜单元素有两种病房自定义帖子类型,因此我们可以使用自定义帖子类型API和post_meta方法。因此,要保存自定义菜单字段值,请在rc_scm_add_custom_nav_fields()下添加此函数:
/** * Save menu custom fields * * @access public * @since 1.0 * @return void */ function rc_scm_update_custom_nav_fields( $menu_id, $menu_item_db_id, $args ) { // Check if element is properly sent if ( is_array( $_REQUEST['menu-item-subtitle']) ) { $subtitle_value = $_REQUEST['menu-item-subtitle'][$menu_item_db_id]; update_post_meta( $menu_item_db_id, '_menu_item_subtitle', $subtitle_value ); } }
在此函数中,我们正在检查自定义字段值是否从我们即将创建的表单中发送,然后我们仅存储其值。现在我们必须将函数添加到适当的钩子中。为此,请将以下行添加到__construct()中:
// save menu custom fields
add_action( 'wp_update_nav_menu_item', array( $this, 'rc_scm_update_custom_nav_fields'), 10, 3 );
步骤4:表格
如果您逐步按照本教程操作,您可能会猜到我们还没有创建必须包含字幕字段的表单。这部分比以前的部分要复杂一些。这次我们要和沃克打交道。我真的鼓励您阅读有关Walker类的编解码器,这确实可以帮助您了解它的含义和作用。顺便说一下,它们是Internet上许多不错的教程,可以为您提供有关该课程的更多详细信息,因此请查看它们!在大多数情况下,助行器用于修改菜单的HTML输出。在这里,我们正在处理管理菜单输出表单。只需将此函数添加到您的主类中:
/**
* Define new Walker edit
*
* @access public
* @since 1.0
* @return void
*/
function rc_scm_edit_walker($walker,$menu_id) {
return 'Walker_Nav_Menu_Edit_Custom';
}
然后这对构造函数:
// edit menu walker
add_filter( 'wp_edit_nav_menu_walker', array( $this, 'rc_scm_edit_walker'), 10, 2 );
这是用一个自定义菜单替换默认的admin编辑菜单窗体。现在添加了过滤器,将以下两行复制到sweet-custom-menu.php文件的底部,在rc_sweet_custom_menu类之外:
include_once( 'edit_custom_walker.php' ); include_once( 'custom_walker.php' );
我们将包含两个文件。第一个是“ edit_custom_walker.php”,它将修改默认表单以编辑菜单。我们将在此文件中添加字幕字段。
第二个是网站前端使用的welker,该文件将修改菜单输出给访问者。
由于“ edit_custom_walker.php”有点长,因此我将不粘贴整个代码。您可以在此处查看整个代码。我添加到它的唯一代码是从174行到185行。这是添加的代码:
<p class="field-custom description description-wide"> <label for="edit-menu-item-subtitle-<?php echo $item_id; ?>"> <?php _e( 'Subtitle' ); ?><br /> <input type="text" id="edit-menu-item-subtitle-<?php echo $item_id; ?>" class="widefat code edit-menu-item-custom" name="menu-item-subtitle[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->subtitle ); ?>" /> </label> </p>
如果要向菜单添加更多字段,只需复制这些行并复制并粘贴即可。完成此步骤后,菜单应在管理中正常工作。在向菜单添加新元素时,您现在应该可以看到新的“字幕”字段。如果不是这种情况,请逐步遵循本教程。现在是时候在前端输出字幕值了。
步骤5:自定义字段输出
如果在管理中一切正常,您现在可能想要在前端显示字幕。打开custom_walker.php并添加此代码:
<?php
/**
* Custom Walker
*
* @access public
* @since 1.0
* @return void
*/
class rc_scm_walker extends Walker_Nav_Menu
{
function start_el(&$output, $item, $depth, $args)
{
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
$class_names = ' class="'. esc_attr( $class_names ) . '"';
$output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$prepend = '<strong>';
$append = '</strong>';
$description = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';
if($depth != 0)
{
$description = $append = $prepend = "";
}
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
$item_output .= $description.$args->link_after;
$item_output .= ' '.$item->subtitle.'</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}
此代码非常标准。唯一重要的是这些行:
$item_output .= ' '.$item->subtitle.'';
步骤6:致电Walker!
在最后一步中,您将需要打开主题文件夹中的header.php文件。大部分时间是在此菜单中。如果不是,请联系主题创建者以了解其调用位置。
找到wp_nav_menu()函数。
然后只需添加walker参数:
'walker' => new rc_scm_walker
而已 !希望您喜欢在WordPress菜单中添加自定义字段。现在,您可以对此代码进行一些修改,以添加其他字段,例如复选框,选择下拉列表,文本区域等…随时在注释部分添加注释。如果发现错误,则进行改进等…
Sweet Custom Menu插件
如果您希望实施本教程,则可以下载我为入门而创建的“ Sweet Custom Menu Plugin”。请享用!
微信扫描二维码联系我们!
我们在微信上24小时期待你的声音
提供外贸路由器设备产品,轻松翻墙,解答:WP主题推荐,WP网站建设,Google SEO,百度SEO,专业服务器环境搭建等!
需要提供WordPress主题/插件的汉化服务可以随时联系我们!另外成品WordPress网站以及半成品WordPress网站建设,海外Google SEO优化托管服务,百度SEO优化托管服务,Centos/Debian服务器WP专用环境搭建,WP缓存服务器搭建,我们都是你的首选,拥有多年WP开源程序服务经验,我们一直在坚持客户体验,没有最好,只有更好!