как вставить шорткод в меню вордпресс

Я сделал пункт меню с этим кодом. Пункт меню отображается, но вывод шорткода отсутствует. Есть ли что-то, что я могу добавить, или другой метод, который сделает это. Я также добавил в надежде, что это может помочь.

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;
}

Спасибо


person xyz    schedule 09.07.2012    source источник


Ответы (3)


Вы не можете использовать короткие коды непосредственно в 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';
),

Обратите внимание, что я не использую do_shortcode(), поскольку это ресурсоемкая функция и неподходящий инструмент. за работу в этом случае.

person J.D.    schedule 07.11.2013
comment
Ничего себе, это действительно сработало, долго искал это. Большое спасибо JD - person xyz; 08.11.2013
comment
@Дж.Д. - Привет, я пытаюсь добавить этот шорткод в ваш код, но он не работает ([ip:GB]020 7267 5222[/ip]). Не могли бы вы мне помочь - person Nuno Sarmento; 07.07.2015
comment
@CabLondon — для этого вы можете использовать do_shortcode( '[ip:GB]020 7267 5222[/ip]' ); или, что предпочтительнее, call_user_func( $shortcode_tags['my_shortcode'], array( ':GB', '020 7267 5222', 'ip' );. - person J.D.; 07.07.2015
comment
@Дж.Д. привет, как я могу добавить свой шорткод в ваш обновленный ответ, это мой шорткод [easy-pricing-table id=4227] Можете ли вы мне помочь, пожалуйста? - person emresancaktar; 03.10.2016
comment
@emresancaktar Измените строку $atts = array() на $atts = array( 'id' => 4227 );. Я обновлю ответ, чтобы сделать это более понятным. - person J.D.; 03.10.2016
comment
@Дж.Д. спасибо за ответ, мой шорткод [easy-pricing-table id=4227], и я изменил ваш код на $shortcode = 'easy-pricing-table'; $atts = массив('id' => 4227); и я создал пользовательскую ссылку с URL-адресом #profile_link# для теста, но она не работает. Никаких ошибок или предупреждений нет, но ничего не происходит - person emresancaktar; 03.10.2016
comment
Кстати, это ссылка на мой вопрос, которую я задал 2 дня назад и заявил о награде 50 представителей, но ответы не работают. stackoverflow.com/questions/39612560/ - person emresancaktar; 03.10.2016

@Tim Этот код будет работать

поместите его в файл functions.php

add_filter('wp_nav_menu_items', 'do_shortcode');
person usama sulaiman    schedule 13.07.2013
comment
@ Тим, ты можешь добавить любые необязательные аргументы для этого кода, я даю тебе только основной - person usama sulaiman; 13.07.2013
comment
Спасибо Усама, я ценю ответ - person xyz; 12.02.2014
comment
Обратите внимание всем, кто приходит сюда из Google, это полностью меню в современных версиях Wordpress. - person John Smith; 27.05.2020
comment
@JohnSmith Это что? - person Gerard Reches; 24.12.2020

Включите описание на странице меню, вставьте в текстовую область описания ссылки свой шорткод, в functions.php добавьте следующий код:

add_filter('walker_nav_menu_start_el', function($item_output, $item) {
    if (!is_object($item) || !isset($item->object)) {
        return $item_output;
    }

    if ($item->ID === 829) {
        $item_output = do_shortcode($item->description);
    }

    return $item_output;
}, 20, 2);
person realmag777    schedule 20.07.2020