web-dev-qa-db-ja.com

Wp_nav_menuではメニューの注文がうまくいかないのはなぜですか?

新しいメニューシステムを使用したカスタムメニューがありますが、正しい順序で返されません。アルファベット順でも日付順でも、また私が見ることができるパターン順でも、その順序はわかりません。

リンクは http://www.oia.co.za/ です。

「スポンサー」、「アーカイブ」、および「トミーカフェ」のページは、一連の数字の後ではなく、最後の3項目として表示されるはずです。最初の項目が数字でもない場合は、すべての番号を最後にレンダリングしたと思いますが、その最初の項目( "8333")の種類のscuppersがその考えです。

正しくドラッグアンドドロップされたメニューの順序のスクリーンショット、誤った順序を表示したWebサイトのスクリーンショット、およびメニューを呼び出すために使用されるコードは以下のとおりです。

correct menu order

enter image description here

    <!-- BEGIN ADVENT CALENDAR -->
    <nav role="navigation">
        <?php 
            wp_nav_menu( array(
                'theme_location' => 'advent-calendar',
                'menu' => 'advent-calendar',
                'menu_class' => 'component-calendar',
                'container_id' => 'calendar',
                'container_class' => 'advent',
                'orderby' => 'menu_order',
                'walker'=> new Salamander_Advent_Walker()
                ) 
            );
        ?>
    </nav>
    <!-- END ADVENT CALENDAR -->

編集:それは間違いなく私のカスタムウォーカー(下のコード)の問題です - 私はカスタムウォーカー関数への呼び出しをコメントアウトした場合、それは正しい順序で生成されます:

    class Salamander_Advent_Walker extends Walker_page {
        function start_el(&$output, $item, $depth, $args) {
           private $color_idx = 1;

            $advent_thumbnail = get_post_meta($item->object_id, 'advent-thumb', true);
            $advent_slug = get_post_meta($item->object_id, 'advent-slug', true);
            $advent_oneliner = get_post_meta($item->object_id, 'advent-oneliner', true);
            $advent_color = get_post_meta($item->object_id, 'advent-color', true);
            $advent_small_title = get_post_meta($item->object_id, 'advent-title', true);

            $advent_title = ( !empty($advent_small_title) ? $advent_small_title : $advent_slug);

            $output .= $indent . '
                        <li class="color'.$this->color_idx.' active">
                        <a href="#day'. $advent_slug .'">
                            <span class="day">
                                <strong>'. $advent_slug .'</strong>
                                <span>&nbsp;</span>
                            </span>
                            <span class="content">
                                <small class="'. $advent_color .'">'. $advent_title .'</small>
                                <img src="'. $advent_thumbnail .'" width="126" height="91" alt="advent" />
                                <strong>'. $advent_oneliner .'</strong>
                            </span>
                        </a>
                    ';
            $this->color_idx++;
            if ($this->color_idx > 4) {
                $this->color_idx = 1;
            }
        } // ends function
    } // ends class
4
Amanda

_ afaik _ menu_orderに設定できる、文書化されていないorderbyパラメータがあります。

編集: / /wp-includes/nav-menu-template.php 195行目の内側の真っ直ぐ、(WP 3.3.1):

$sorted_menu_items = array();
foreach ( (array) $menu_items as $key => $menu_item )
    $sorted_menu_items[$menu_item->menu_order] = $menu_item;

ウォーカーが走る直前のラインです。そのため、セットmenu_orderは順序に影響を与えるはずです。メタボックスからページ内に設定するだけです。

一言で言えば:あなたはカスタムウォーカーをまったく必要とすべきではありません。

Sidnotes:

  • その$indentを使う必要はありません。ソースコードだけなので、実際には意味がありません。
  • メタデータを単一のvarに保存するのをそれほど難しくする必要はありません。また、現在キャッシュされていない場合、これによって多くのクエリが追加されます。次のようにしてください。

    extract( get_post_custom( $item->object_id ), EXTR_SKIP );
    

編集: extractは単にカスタムメタデータから単一の変数を作成します。 keyはあなたの変数の新しい名前です。 EXTR_SKIPは、二重キーをスキップするので、変数を一意にすることを気にかけます。

// Example: Structure of your post custom/meta data
Array( 
    [0] => array( 'example_key_name' => array( 'example_value' ) )
    [1] => array( 'another_key_name' => 'another_value' )
)
// Becomes:
$example_key_name = array( 0 => 'example_value' );
// Value can now be called as:
$example_key_name[0];
// Becomes:
$another_key_name = 'another_value';
// Value can be called as:
$another_key_name

最後の例は実際には可能ではありません、あなたは通常シリアライズされた配列をカスタム値として持っています(単一の値でさえも)。だからあなたは常にあなたの変数に[0]を追加する必要があります。しかしこのテクニックはdefです。コードを短くします。あなたが投稿/ CPTあたりのメタデータの本当に大きなセットを持っているなら特に。

3
kaiser