17713433920 info@mac163.com

他们在网络上有太多教程来解释“如何向WordPress菜单添加自定义字段”,但是其中大多数教程都涉及如何使用默认Description字段的默认CSS字段。他们都没有提供一种向菜单中添加真正的新字段的真实方法。因此,今天我们将创建一个简单的插件,该插件将在任何WordPress菜单中添加一个“字幕”字段。

这是WordPress管理中的最终结果:

将自定义属性添加到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开源程序服务经验,我们一直在坚持客户体验,没有最好,只有更好!
回到顶部