web-dev-qa-db-ja.com

ショートコードをwordpressメニューに挿入する方法

このコードでメニュー項目を作成しました。メニュー項目は表示されますが、ショートコード出力はありません。追加できるものや、これを行う別の方法はありますか。これが役立つことを願って追加しました。

add_filter('wp_nav_items', 'do_shortcode', 7);

あるいは、誰かがこれが不可能であることを知っていて、私に言うことができるかもしれません。

/* Nav Menu */
function add_profile_link_to_nav(){ 
 if ( is_user_logged_in() ) { ?> 

<ul> 
  <li class="menu-item"id="one"> <a href="http://example.com/members/">All  Members</a>
  <ul class="sub-menu"> 
      <li class="menu-item"><?php echo custom_execute_shortcode(); ?> </li>
  </ul> 
 </li>
</ul>    <!--end menu--->
<?php } 
}
add_action( "wp_nav_items","add_profile_link_to_nav" );

function custom_execute_shortcode() {
$myfunction= '[my shortcode"]';
$myfunction_parsed = do_shortcode($myfunction);
return $myfunction_parsed;
}

ありがとう

8
xyz

角かっこが削除されるため、メニューページのメニューURLでショートコードを直接使用することはできません。ただし、次のようなプレースホルダーを使用できます:_#profile_link#_。

_functions.php_の次のコードを使用すると、URL _#profile_link#_でカスタムメニュー項目を作成でき、それがショートコードに置き換えられます。

_/**
 * Filters all menu item URLs for a #placeholder#.
 *
 * @param WP_Post[] $menu_items All of the nave menu items, sorted for display.
 *
 * @return WP_Post[] The menu items with any placeholders properly filled in.
 */
function my_dynamic_menu_items( $menu_items ) {

    // A list of placeholders to replace.
    // You can add more placeholders to the list as needed.
    $placeholders = array(
        '#profile_link#' => array(
            'shortcode' => 'my_shortcode',
            'atts' => array(), // Shortcode attributes.
            'content' => '', // Content for the shortcode.
        ),
    );

    foreach ( $menu_items as $menu_item ) {

        if ( isset( $placeholders[ $menu_item->url ] ) ) {

            global $shortcode_tags;

            $placeholder = $placeholders[ $menu_item->url ];

            if ( isset( $shortcode_tags[ $placeholder['shortcode'] ] ) ) {

                $menu_item->url = call_user_func( 
                    $shortcode_tags[ $placeholder['shortcode'] ]
                    , $placeholder['atts']
                    , $placeholder['content']
                    , $placeholder['shortcode']
                );
            }
        }
    }

    return $menu_items;
}
add_filter( 'wp_nav_menu_objects', 'my_dynamic_menu_items' );
_

_'shortcode'_配列に_$placeholders_を設定する必要があり、オプションで_'atts'_と_'content'_を設定する必要があります。

たとえば、ショートコードが次のような場合:

_[example id="5" other="test"]Shortcode content[/example]
_

更新します:

_'#placeholder#' => array(
    'shortcode' => 'example';
    'atts' => array( 'id' => '5', 'other' => 'test' );
    'content' => 'Shortcode content';
),
_

I do_shortcode() はリソースを大量に消費する関数であり、この場合のジョブに適したツールではないため、使用しないでください。

9
J.D.

@Timこのコードは機能します

それをfunctions.phpファイルに入れます

add_filter('wp_nav_menu_items', 'do_shortcode');
23
usama sulaiman