2012-07-09 39 views
6

Tôi đã tạo một mục menu với mã này. Mục menu hiển thị nhưng đầu ra shortcode không có ở đó. Có điều gì tôi có thể thêm hoặc phương pháp khác sẽ thực hiện việc này không. Tôi cũng đã thêm vào với hy vọng điều này có thể hữu ích.cách chèn mã ngắn vào menu wordpress

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

Hoặc có thể ai đó biết điều này là không thể và có thể cho tôi biết.

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

Cảm ơn

Trả lời

6

Bạn không thể sử dụng shortcodes trực tiếp trong URL menu trên trang menu, bởi vì các dấu ngoặc bị tước bỏ. Nhưng bạn có thể sử dụng trình giữ chỗ như thế này: #profile_link#.

Với mã sau trong functions.php, bạn có thể tạo mục menu tùy chỉnh với URL #profile_link# và nó sẽ thay thế bằng mã ngắn của bạn.

/** 
* 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'); 

Bạn chỉ cần thiết lập 'shortcode' trong mảng $placeholders, và tùy chọn 'atts''content'.

Ví dụ, nếu shortcode của bạn là như thế này:

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

Bạn sẽ cập nhật:

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

Lưu ý rằng tôi don't use do_shortcode() bởi vì nó là một nguồn lực chức năng chuyên sâu và không phải là công cụ phù hợp cho công việc trong trường hợp này.

+0

Wow mà thực sự làm việc, được tìm kiếm một thời gian dài dài cho điều này. Rất cám ơn J.D – xyz

+0

Chỉ là những gì tôi đang tìm kiếm, cảm ơn! – hotshots

+0

@ J.D. Xin chào, tôi đang cố thêm mã ngắn này vào mã của bạn, nhưng nó sẽ không hoạt động ([ip: GB] 020 7267 5222 [/ ip]). Bạn có thể giúp tôi xin vui lòng –

13

@ Tim Mã này sẽ làm việc

đặt nó trong tập tin functions.php

add_filter('wp_nav_menu_items', 'do_shortcode'); 
+0

@ Tim bạn có thể thêm bất kỳ args tùy chọn cho mã đó, tôi chỉ cung cấp cho bạn cơ bản một –

+0

Cảm ơn bạn Tôi Usama đánh giá cao những phản ứng – xyz

+0

@ Tim Bạn được hoan nghênh :) –

Các vấn đề liên quan