2012-07-09 25 views
6

Ho creato una voce di menu con questo codice. L'elemento del menu appare ma l'uscita shortcode non è presente. C'è qualcosa che posso aggiungere o un metodo diverso che lo farà. Ho aggiunto anche nella speranza che questo possa aiutare.come inserire lo shortcode nel menu wordpress

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

O forse qualcuno sa che questo non è possibile e può dirmelo.

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

Grazie

risposta

6

Non è possibile utilizzare i codici brevi direttamente nell'URL menu a pagina del menu, perché le parentesi vengono rimosse. Ma puoi usare segnaposti come questo: #profile_link#.

Con il seguente codice in functions.php, è possibile creare una voce di menu personalizzata con l'URL #profile_link# e la sostituirà con lo shortcode.

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

Hai solo bisogno di impostare 'shortcode' nella matrice $placeholders, e facoltativamente 'atts' e 'content'.

Ad esempio, se il codice funzione è simile a questo:

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

che ci si aggiorna:

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

Si noti che ho don't use do_shortcode() perché è una funzione intensivo di risorse e non è in questo caso lo strumento giusto per il lavoro.

+0

Wow che funzionava davvero, sembrava da molto tempo per questo. Molte grazie J.D – xyz

+0

Proprio quello che stavo cercando, grazie! – hotshots

+0

@ J.D. - Ciao, sto cercando di aggiungere questo shortcode nel tuo codice, ma non funzionerà ([ip: GB] 020 7267 5222 [/ ip]). Potete aiutarmi per favore –

13

@ Tim Questo codice funzionerà

messo nel file di functions.php

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

@Tim puoi aggiungere qualsiasi argomento opzionale per quel codice, ti do solo quello base –

+0

Grazie usama, apprezzo la risposta – xyz

+0

@Tim, sei il benvenuto :) –

Problemi correlati