web-dev-qa-db-ja.com

すべてのサブカテゴリを持つメニューを作成する方法?

毎回自動的にメニューに表示されるサブカテゴリがあるようなカテゴリでメニューを作成することは可能ですか?

私が知っている限りでは、 "フルーツ"というカテゴリのメニューがあり、 "バナナ"というサブカテゴリを作成する場合は、手動で追加する必要があります。

6
nsn

これはあなたが話しているメニューの種類によって異なります。

1)

「カスタムメニュー」(バックエンドの「デザイン」 - >「メニュー」にあります)について話しているのであれば、次のことができます。

  • アクションフックで新しい関数を作成してください add_category

  • この関数の中で、あなたはあなたのメニューに正しく追加されているタイプのメニューアイテムタイプの新しいポストを作成することができます

  • 新しいカテゴリが公開されるたびにメニュー項目が追加されます

  • メニューを最新に保つために、カテゴリの削除にもフックする必要があります

2)

ワードプレスメニューがなくても、もっと簡単にできます。

  • あなたのカテゴリーをリストするための関数を書くだけです(あるいは事前に定義されたwp_list_categories関数を使います)
  • これで十分でない場合は、カスタマイズされたものを作成してください。
    recursivley)データベースからあなたのカテゴリを読み込みます

オプション1をコーディングするには、WordPressに関する知識が必要です。

3
Blackbam

wp_list_categories を使うのが好きです。これが私の最後のプロジェクトで使用したコードです。

<?php wp_list_categories('orderby=ID&exclude=3,10,1,16,38&title_li=<span class="sidebar_heading d_shadow">' . __('Categories') . '</span>'); ?>

あなたはすべてのあなたのカテゴリとサブカテゴリのリストを得るでしょう。

2

多くの調査の結果、私は信頼できる有用な解決策を見つけました。

class EntexAutoSubmenu {

    /**
     * Constructor
     */
    function __construct(){
        add_action('created_category', array($this, 'on_publish_category'));
    }

    /**
     * When publishing a new child category, add it to the appropriate custom menu.
     */
    function on_publish_category($cat_id){

        // Theme supports custom menus?
        if (!current_theme_supports('menus')) return;

        // Published taxonomy has parent?
        $cat = get_category($cat_id);
        if (!$cat->category_parent) return;

        $all_menus = get_terms('nav_menu', array('hide_empty' => true));

        // Loop through the menus to find page parent
        foreach ($all_menus as $menu) {

            $menu_parent = NULL;
            $menu_items = wp_get_nav_menu_items($menu->term_id, array('post_status' => 'publish,draft'));

            if (!is_array($menu_items)) continue;

            foreach ($menu_items as $menu_item){
                // Item already in menu?
                if ($menu_item->object_id == $cat_id) continue 2;
                if ($menu_item->object_id == $cat->category_parent) $menu_parent = $menu_item;
            }

            // Add new item
            if ($menu_parent) {
                wp_update_nav_menu_item($menu->term_id, 0, array(
                    'menu-item-object-id' => $cat_id,
                    'menu-item-object' => $cat->taxonomy,
                    'menu-item-parent-id' => $menu_parent->ID,
                    'menu-item-type' => 'taxonomy',
                    'menu-item-status' => 'publish'
                ));
            }
        }
    }
}

$auto_submenu = new EntexAutoSubmenu();
1
Jonas Lundman

List Custom Taxonomy Widget を使用することもできます(WP nav_menuを使用する予定がない場合)。

1
David Senkus

私は自分のクライアント用に自分自身をコーディングした

<div class="menu">
  <ul id="MenuBar1" class="MenuBarHorizontal">
    <li><a <?PHP if( count($_GET) == 0 ){ echo 'class="-current"';} ?> href="<?php echo esc_url( home_url( '/' ) ); ?>">home</a></li>
    <?php
        $category_ids = get_all_category_ids();
        sort($category_ids);
        foreach($category_ids as $cat_id) {
            $cat_name = get_cat_name($cat_id);

            echo '<li><a href="' . get_category_link( $cat_id ) . '">' . $cat_name . '</a>';            
            $args = array( 'numberposts' => -1, 'offset'=> 0, 'cat' => $cat_id, 'orderby' => 'ID', 'order' => 'ASCE' );     

            echo '<ul>';

            /* The 2nd Query (without global var) */
            $query2 = new WP_Query( $args );
            // The 2nd Loop
            while( $query2->have_posts() ):
                $query2->next_post();
                echo '<li><a href="' . get_permalink( $query2->post->ID ) . '">' . get_the_title( $query2->post->ID ) . '</a></li>';
            endwhile;

            // Restore original Query & Post Data
            wp_reset_query();
            wp_reset_postdata();
            echo '</ul>';
        echo '</li>';
        }
    ?>
  </ul>
</div>
1
0_0

この問題を解決するために、メニューの場合は親カテゴリの下にカテゴリを公開するためのメニュー項目を自動的に作成するプラグインを作成しようとしました。

プラグインのアイデア:

1.inコード、私は "created_ $ taxonomy" action hookを使用しました。

2.( wp_get_nav_menu_item sを使用して)すべてのメニュー項目を収集します。

3.公開カテゴリの親が、その親カテゴリのサブメニューとして作成されたメニュー項目よりもメニュー項目内にある場合は、条件を設定します( wp_update_nav_menu_item を使用)。

<?php
/*
Plugin Name: Auto Category Submenu
Plugin URI: 
Description: Create menu item when category publish/create if it's parent category in menu item.
Version: 0.1
Author: Mayank Gupta/Ravinder Kumar
Author URI: 
License: GPL2
*/

class AutoSubmenu {

    /**
     * Constructor
     */
    function __construct() {
        add_action( 'created_category', array( &$this, 'on_publish_cat' ) );
    }

    /**
     * When publishing a new child page, add it to the appropriate custom menu.
     */
    function on_publish_cat( $cat_id ) {
        $cat = get_category( $cat_id );

        //menu id for you menus in which your sub-category's parent category as menu item 
        $menu_ids = array(101,100);

        //retrieve all meu items from menu
        foreach($menu_ids as $menu_id){
            $menu_items[] = wp_get_nav_menu_items( $menu_id, array('post_status' => 'publish','post_type' => 'nav_menu_item','output' => ARRAY_A, ) );
        }
        foreach($menu_items as $menu_item){
            $counter = 0 ;
            echo'<!--';
            print_r($menu_item);
            echo'-->';
            foreach($menu_item as $menu_term){
                $menu_terms_id[] = $menu_term->object_id; //all menu items id
            }
        }
        //print_r($menu_terms_id); //test for items in menu
        foreach( $menu_terms_id as $menu_term ){
            if( $cat->category_parent == $menu_term){
                wp_update_nav_menu_item( $cat_id, 0, array(
                'menu-item-object-id' => $cat_id,
                'menu-item-object' => $cat->taxonomy,
                'menu-item-parent-id' => $menu_term,
                'menu-item-type' => 'category',
                'menu-item-status' => 'publish'
            ) );
            }else{
                return;
            }
        }
    }

}
$auto_submenu = new AutoSubmenu();

注:カテゴリ発行時にエラー(ヘッダーは既に送信されています)およびメニュー項目が表示されないプラグインです。問題がある場合は別のトピックになるかもしれません。私がそれをここに置くことによって何か悪いことをしているのであれば

1
Ravinder Kumar

私は自分のプロジェクトのメニューとしてカテゴリのすべてのカテゴリとサブカテゴリを表示するために使用しています。

$all_categories = get_categories( $args );
echo "<div class='container'>";
 echo "<div class='productsubmenu'>";
echo "<ul>";

foreach ($all_categories as $cat)
{           

if($cat->category_parent == 0)
 {
  $category_id = $cat->term_id;
   $thumbnail_id = get_woocommerce_term_meta( $cat->term_id,    'thumbnail_id', true );
$image = wp_get_attachment_url( $thumbnail_id );

echo '<li class="parent '.$my.' "><a href="'.get_term_link( $cat ) . '">'.$cat->name.'</a>';


$args2 = array(
'taxonomy' => $taxonomy,
'child_of' => 0,
'parent' => $category_id,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty

);
   $args = array(
   'hierarchical' => 1,
   'show_option_none' => '',
   'hide_empty' => 0,
   'parent' => $parent_cat_ID,
   'taxonomy' => 'product_cat'
);
 $subcats = get_categories($args2);
 echo '<ul class="wooc_sclist">';

  foreach ($subcats as $sc) { 

        }

    $link = get_term_link( $sc->slug, $sc->taxonomy );
    echo '<li class="'.$my.'" ><a href="'. $link .'">'.$sc->name.'</a></li>';
  }
echo '</ul>';
echo "</li>";
}
else
{

 }
 }

    echo "</ul>";
   echo "</div>";
   echo "</div>";
0