WordPressのカスタムメニューで、子階層があったら自動で親階層に任意の文字を表示する

       
WPのカスタムナビメニュー

ご無沙汰をゴブタサだと思っていた友人がいる内藤です。
WordPressのカスタムメニューは便利でいいですよねー。でも、子階層がある場合に、自動で何か文字でもアイコンでも表示してくれるといいのにな~と思ったことはありませんか?
WPのソースコードを改造したらできたのですが・・・




上手く表現できませんでしたが、要は、子階層がある場合に下図のように、メニューの文字の右隣に「子階層があるよ」という印を「自動で」出したかったわけです。
カスタムナビメニューで作ったメニュー

予めご了承ください

これに関するフック関数とか調べてません。そして、functionでオーバーライドしているわけでもないです。
いわば、行き当たりばったりで行き着いた無理矢理な方法なので、もしこれをパッケージングできる方法がわかったら教えてくださいm(_ _)m

改造するファイル

※WordPress3.7.1にて

  • wp-includes/category-template.php
  • wp-includes/class-wp-walker.php
  • wp-includes/nav-menu-template.php
  • wp-includes/post-template.php

category-template.php

<br />
        // ここのファンクション定義の引数に$flg=0を追加<br />
	function start_el( &$output, $category, $depth = 0, $flg = 0, $args = array(), $id = 0 ) {<br />

wp-includes/class-wp-walker.php

<br />
	function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {</p>
<p>		if ( !$element )<br />
			return;</p>
<p>		$id_field = $this->db_fields['id'];<br />
		$flg = 0;  // これ追加する</p>
<p>		//display this element<br />
		if ( isset( $args[0] ) && is_array( $args[0] ) )<br />
			$args[0]['has_children'] = ! empty( $children_elements[$element->$id_field] );</p>
<p>		// ここの条件も追加する<br />
		if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$element->$id_field]) )<br />
			$flg = 1;<br />
		// ここで引数に$flgを追加する<br />
		$cb_args = array_merge( array(&$output, $element, $depth, $flg), $args);<br />
		call_user_func_array(array($this, 'start_el'), $cb_args);<br />

wp-includes/nav-menu-template.php

<br />
	// 引数に$flg=0を追加<br />
	function start_el( &$output, $item, $depth = 0, $flg = 0, $args = array(), $id = 0 ) {<br />
		$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';</p>
<p>		$class_names = $value = '';</p>
<p>		$classes = empty( $item->classes ) ? array() : (array) $item->classes;<br />
		$classes[] = 'menu-item-' . $item->ID;</p>
<p>		/**<br />
		 * Filter the CSS class(es) applied to a menu item's</p>
<li>.<br />
		 *<br />
		 * @since 3.0.0<br />
		 *<br />
		 * @param array  $classes The CSS classes that are applied to the menu item's</p>
<li>.<br />
		 * @param object $item    The current menu item.<br />
		 * @param array  $args    An array of arguments. @see wp_nav_menu()<br />
		 */<br />
		$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );<br />
		$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';</p>
<p>		/**<br />
		 * Filter the ID applied to a menu item's</p>
<li>.<br />
		 *<br />
		 * @since 3.0.1<br />
		 *<br />
		 * @param string The ID that is applied to the menu item's</p>
<li>.<br />
		 * @param object $item The current menu item.<br />
		 * @param array $args An array of arguments. @see wp_nav_menu()<br />
		 */<br />
		$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );<br />
		$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';</p>
<p>		$output .= $indent . '</p>
<li' . $id . $value . $class_names .'>';</p>
<p>		$atts = array();<br />
		$atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';<br />
		$atts['target'] = ! empty( $item->target )     ? $item->target     : '';<br />
		$atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';<br />
		$atts['href']   = ! empty( $item->url )        ? $item->url        : '';</p>
<p>		/**<br />
		 * Filter the HTML attributes applied to a menu item's <a>.<br />
		 *<br />
		 * @since 3.6.0<br />
		 *<br />
		 * @param array $atts {<br />
		 *     The HTML attributes applied to the menu item's <a>, empty strings are ignored.<br />
		 *<br />
		 *     @type string $title  The title attribute.<br />
		 *     @type string $target The target attribute.<br />
		 *     @type string $rel    The rel attribute.<br />
		 *     @type string $href   The href attribute.<br />
		 * }<br />
		 * @param object $item The current menu item.<br />
		 * @param array  $args An array of arguments. @see wp_nav_menu()<br />
		 */<br />
		$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );</p>
<p>		$attributes = '';<br />
		foreach ( $atts as $attr => $value ) {<br />
			if ( ! empty( $value ) ) {<br />
				$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );<br />
				$attributes .= ' ' . $attr . '="' . $value . '"';<br />
			}<br />
		}</p>
<p>		$item_output = $args->before;<br />
		$item_output .= '<a'. $attributes .'>';<br />
		/** This filter is documented in wp-includes/post-template.php */<br />
		$afterstr = '';</p>
<p>if ( $flg ) { // サブメニューがある場合<br />
	$afterstr = "&nbsp;>";<br />
}</p>
<p>		// 下記の一文で$afterstrを追加<br />
		$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $afterstr . $args->link_after;<br />
		$item_output .= '</a>';<br />
		$item_output .= $args->after;</p>
<p>

wp-includes/post-template.php

<br />
	// ここのファンクション定義の引数に$flg=0を追加<br />
	function start_el( &$output, $page, $depth = 0, $flg = 0, $args = array(), $current_page = 0 ) {<br />


 

 

以上です!・・・なんといういい加減な・・・



英作文のフルーツフルイングリッシュ