カスタムメニューリンクをページまたは投稿に置き換える簡単な方法はありますか?


14

プラグインを探しましたが、何も見つかりませんでした。これはコア機能であるはずです。

問題:

カスタムリンクまたはメニューリンクを置き換える現在の方法は、次のプロセスを実行することです。

  1. 古いメニューリンクを削除
  2. 新しいリンクを挿入
  3. リストの最後から新しいリンクをドラッグします
  4. 目的の場所に新しいリンクをドロップします
  5. 大当たりするまで手順3と4を繰り返します
  6. メニューオプション(CSS、ラベルなど)を再度入力します

なぜそれが問題なのですか

特に次の場合には非常に非効率的です:(a)巨大なメニューを扱う(b)多くのサブレベルを持つメニュー(c)カスタムオプションを持つ多くのメニュー項目を置き換える

ソリューション要件

  1. メニューの位置/階層を保持
  2. オプションを保持(cssクラス、ラベル、タイトル)
  3. ページ/投稿/カテゴリなどから選択してください

デモンストレーション

http://puu.sh/laSEi/81b0d41705.png

そのようにする必要があります:

ここに画像の説明を入力してください

他の考えられるアイデアは、複製する/「これに子リンクを追加する」/またはリストの一番下にではなく一番上に新しいリンクを追加することです。

フィードバックをお願いします。


4
よく練られた質問に対する+1-私はあなたに同意します、それはあまり効率的ではありません。
バージール

3
この質問の問題は、ここの形式に適合する問題の簡単な解決策が見当たらないことです。おそらく、いくつかの領域で機能を調整する必要があります。価値のある機能リクエストのように思えるので、tracでチケットを開くことをお勧めします。
マークカプルン

1
たぶん、TinyMCEから検索を追加して、投稿、URLフィールドのページ、スクリプトwplink.js
bueltge

1
@MarkKaplun私はとにかく、私はあなたの提案に続き、@ tracの要求を作成し、誰かがそれのために不人気あるいは民間のプラグインを知っているかもしれないと思ったcore.trac.wordpress.org/ticket/34648 stackexchangeにこの質問を終了するappropiate方法は何か?
アジズ

2
それを終わらせないでください。すべての質問に受け入れられる、あるいは有効な答えがあるわけではありません。他の人も同じ問題を見ていて答えが見つからなかったことを知っておくとよい場合があります。時には、誰かが非常に遅い答えをすることがあります
Mark Kaplun

回答:


1

これは質問に直接答えるものではありませんが、その基になっているコードが機能を提供します。コードセットは次のとおりです。

関数install_menus(){
    require_once dirname(__FILE__)。'/data.php';
    $ menus = get_menus_data();
    if(!empty($ menus))foreach($ menus as $ menu){
        if($ menu ['build']){
            $ menu_id = create_nav_menu($ menu);
            add_items_to_menu($ menu_id、$ menu ['slug']、$ menu ['items']);
        }
    }
}

function create_nav_menu($ menu){
    if($ exists = wp_get_nav_menu_object($ menu ['name'])){
        $ menu_id = $ exists-> term_id;
          if(empty($ menu_id)){
            $ menu_id = wp_create_nav_menu($ menu ['name']);
        } 
    }
    そうしないと {
        $ menu_id = wp_create_nav_menu($ menu ['name']);
    }
    return $ menu_id;
}
function add_items_to_menu($ menu_id、$ slug、$ items){
    if($ items)foreach($ items as $ item){
        if($ item ['build']){
            $ slug =($ item ['title'] == 'Home')?'home':$ item ['slug'];
            if(!menu_item_exists($ slug、$ menu_id)){
                wp_update_nav_menu_item($ menu_id、0、配列(
                    'menu-item-title' => __($ item ['title'])、
                    'menu-item-classes' => ''、
                    'menu-item-url' => home_url($ item ['slug']。 '/')、 
                    「メニュー項目ステータス」=>「公開」
                    ));
            }
        }
    }
}
function menu_item_exists($ slug、$ menu_id){
    $ args = array(
        'order' => 'ASC'、
        'orderby' => 'menu_order'、
        'post_type' => 'nav_menu_item'、
        「post_status」=>「公開」、
        'output' => ARRAY_A、
        'output_key' => 'menu_order'、
        'nopaging' => true、
        'update_post_term_cache' => false); 

    $ existing = wp_get_nav_menu_items($ menu_id、$ args);
    $ found = false;
    foreach($ existsとして$ existing){
        if(strpos($ exists-> post_name、$ slug)!== FALSE){//かなり良い検索(正確ではない)。
            $ found = true;
            ブレーク;
        }

    }
    return $ found;
}

データファイルは次のとおりです。

関数get_menus_data(){
    $ items = array( 
        配列( 
            「名前」=>「メインメニュー」、「スラッグ」=>「メインメニュー」、「ビルド」=> 1、 
            'items' =>配列(
                array( 'title' => 'Home'、 'slug' => ''、 'build' => 1)、// slugは空でなければなりません
                配列( 'title' => 'Blog'、 'slug' => 'blog'、 'build' => 1)、
                配列( 'title' => 'About'、 'slug' => 'about'、 'build' => 1)、
                配列( 'title' => 'Contact'、 'slug' => 'contact'、 'build' => 1)、
                )、
        )、
        配列( 
            「名前」=>「二次メニュー」、「スラッグ」=>「二次メニュー」、「ビルド」=> 0、
            'items' =>配列(
                配列( 'title' => 'Home'、 'slug' => ''、 'build' => 1)、
                配列( 'title' => 'Blog'、 'slug' => 'blog'、 'build' => 1)、
                配列( 'title' => 'About'、 'slug' => 'about'、 'build' => 1)、
                配列( 'title' => 'Contact'、 'slug' => 'contact'、 'build' => 1)、
                )、
        )、
        配列( 
            「名前」=>「フッターメニュー」、「スラッグ」=>「フッターメニュー」、「ビルド」=> 1、
            'items' =>配列(
                配列( 'title' => 'Terms'、 'slug' => 'terms'、 'build' => 1)、
                配列( 'title' => 'Privacy'、 'slug' => 'privacy'、 'build' => 1)、
                配列( 'title' => 'Contact'、 'slug' => 'contact'、 'build' => 1)、
                )、
            ) 
    );
    $ itemsを返します。
}

求められる選択を可能にするために、この上にインターフェースを構築する必要がありますが、このコードは機能し、テストされています。


こんにちは、ご回答ありがとうございます。投稿したコードについて詳しく説明してください。
アジズ

コードをコピーしてプラグインまたはテーマのfunctions.phpに貼り付けると、get_menus_data()関数内に含まれるメニュー項目が作成されます。検索結果に動的にメニュー項目を追加するには、WordPress APIを使用してそれを行う関数が必要です。これらの機能は、メニュー項目を事前に構成できる完全な自己インストールパッケージの一部であり、理想的にはこれを後で行う必要がありません。これらの関数は「舞台裏で動作する」機能を提供するため、後の検索機能の基礎として使用できます。
cbos

1

これが答えかどうかはわかりませんが、議論のポイントです。

WPメニューを作成するために高度なカスタムフィールドを検討したことがある人はいますか?これを数回行いました。これにより、カスタムメニュー項目属性とともにカスタム構造を構築し、デフォルトのWPメニューで必要な複雑なウォーカーなしでメニューのHTMLを構築できます。

ここに画像の説明を入力してください

ACF

if( function_exists('acf_add_local_field_group') ):

acf_add_local_field_group(array (
    'key' => 'group_56532ec144a4b',
    'title' => 'Menu',
    'fields' => array (
        array (
            'key' => 'field_5653338918f43',
            'label' => 'Menus',
            'name' => 'menus',
            'type' => 'flexible_content',
            'instructions' => '',
            'required' => 0,
            'conditional_logic' => 0,
            'wrapper' => array (
                'width' => '',
                'class' => '',
                'id' => '',
            ),
            'button_label' => 'Add Menu',
            'min' => '',
            'max' => '',
            'layouts' => array (
                array (
                    'key' => '56533396b10bc',
                    'name' => 'menu',
                    'label' => 'Menu',
                    'display' => 'block',
                    'sub_fields' => array (
                        array (
                            'key' => 'field_56533fc6f25e7',
                            'label' => 'Menu Name',
                            'name' => 'menu__name',
                            'type' => 'text',
                            'instructions' => '',
                            'required' => 0,
                            'conditional_logic' => 0,
                            'wrapper' => array (
                                'width' => '',
                                'class' => '',
                                'id' => '',
                            ),
                            'default_value' => '',
                            'placeholder' => '',
                            'prepend' => '',
                            'append' => '',
                            'maxlength' => '',
                            'readonly' => 0,
                            'disabled' => 0,
                        ),
                        array (
                            'key' => 'field_56532ec718f40',
                            'label' => 'Menu Items',
                            'name' => 'menu__items',
                            'type' => 'flexible_content',
                            'instructions' => '',
                            'required' => 0,
                            'conditional_logic' => 0,
                            'wrapper' => array (
                                'width' => '',
                                'class' => '',
                                'id' => '',
                            ),
                            'button_label' => 'Add Menu Item',
                            'min' => '',
                            'max' => '',
                            'layouts' => array (
                                array (
                                    'key' => '56532eee6ef81',
                                    'name' => 'menuItem',
                                    'label' => 'Menu Item',
                                    'display' => 'block',
                                    'sub_fields' => array (
                                        array (
                                            'key' => 'field_56532f0418f41',
                                            'label' => 'Label',
                                            'name' => 'menuITem__label',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 50,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_565333d218f45',
                                            'label' => 'Class',
                                            'name' => 'menuItem__class',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 50,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_565342ef11b29',
                                            'label' => 'Link Type',
                                            'name' => 'menuItem__type',
                                            'type' => 'radio',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 25,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'choices' => array (
                                                'page' => 'Page',
                                                'cat' => 'Category',
                                                'url' => 'URL',
                                                'cust' => 'Custom',
                                            ),
                                            'other_choice' => 0,
                                            'save_other_choice' => 0,
                                            'default_value' => '',
                                            'layout' => 'vertical',
                                        ),
                                        array (
                                            'key' => 'field_56532f2d18f42',
                                            'label' => 'Page',
                                            'name' => 'menuItem__page',
                                            'type' => 'page_link',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'page',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'post_type' => array (
                                            ),
                                            'taxonomy' => array (
                                            ),
                                            'allow_null' => 0,
                                            'multiple' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653434f11b2a',
                                            'label' => 'Category',
                                            'name' => 'menuItem__cat',
                                            'type' => 'taxonomy',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'cat',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'taxonomy' => 'category',
                                            'field_type' => 'select',
                                            'allow_null' => 0,
                                            'add_term' => 1,
                                            'save_terms' => 0,
                                            'load_terms' => 0,
                                            'return_format' => 'id',
                                            'multiple' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653439311b2c',
                                            'label' => 'Custom',
                                            'name' => 'menuItem__cstm',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'cust',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653437011b2b',
                                            'label' => 'URL',
                                            'name' => 'menuItem__url',
                                            'type' => 'url',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'url',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                        ),
                                    ),
                                    'min' => '',
                                    'max' => '',
                                ),
                            ),
                        ),
                    ),
                    'min' => '',
                    'max' => '',
                ),
            ),
        ),
    ),
    'location' => array (
        array (
            array (
                'param' => 'options_page',
                'operator' => '==',
                'value' => 'acf-options-theme-options',
            ),
        ),
    ),
    'menu_order' => 0,
    'position' => 'normal',
    'style' => 'default',
    'label_placement' => 'top',
    'instruction_placement' => 'label',
    'hide_on_screen' => '',
    'active' => 1,
    'description' => '',
));

endif;

UX

function acfMenu($name) {
    if( function_exists('get_field') ) :
        $getMenus = get_field('menus', 'option');
        foreach($getMenus as $menuData) : 
            if( $menuData['menu__name'] == $name ) : 
              // Do stuff to build your menu
            endif;
        endforeach;
    endif;
}

これは簡単なサンプルですが、ACFが提供するオプションを使用して、あらゆる種類のものをメニュー項目に追加し、UIを自由にコーディングできます。

特定の質問に適用する場合、条件付きの選択を、提供するリンクのタイプに適用できます(添付画像を参照)。ACFでは、ページリンク、カテゴリリンク、ストレートURLなど、さまざまなパラメーターを使用できます。これらの項目を条件付きで選択すると、クラスやその他の属性を消去せずにメニュー項目のタイプを変更できます。


良い提案を見る-スクリーンショットがあなたのアイデアをよりよく理解するのに役立つと確信しています
;

こんなに大きなスクリーンショットを撮れるかどうかはわかりません。ネストされたACF機能は、やや面倒になります。
ティムプラマー

0

これは、適切なアプローチを定義するのに役立ちます。

WPの背後にあるダミーダウンの哲学は、そもそもセットアップメニューを使用する方法を推進します。これは、コンテンツを頻繁に変更するサイトを処理するためのフレームワークとしてWPが不適切な選択になる理由の1つにすぎません。

コンテンツ管理を可能な限りダミーの証拠として作成しようとすると、それを特定のパラダイムにロックし、多くの場合、正当な理由がないために余分な作業を作成します。メニューテンプレートを保存したり、既存のメニューを複製したり、再利用可能なメニュー項目を構成を失うことなく安全に保存することはできません。

これは、提供するネイティブメニュー形式に代わる優れた選択肢となる提案です。ダミープルーフアプローチと、柔軟性と展開の速度の両方を兼ね備えた優れた中間点だからです。そして、いらいらさせるドラッグアンドドロッププロセスの代替としてソートパラメーターを追加します。

ただし、WPのメニュー管理を変更したいのですが、このパスを押し下げすぎると、WPのコア哲学に反することになり、最も一般的な分母に対応できなくなってしまうことがあります。 WP。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.