Come aggiungere un attributo di dati a una voce di menu di WordPress


17

Sono Twitter Bootstrap e devo aggiungere l'attributo data-toggle = "modal" al collegamento a tag del menu. Durante la ricerca della maggior parte dei risultati, fare riferimento ai menu a discesa Bootstrap di Twitter, tuttavia questo menu non ha menu a discesa e ho solo bisogno di aggiungere l'attributo particolare.

Successivamente ho trovato questo: aggiungere attributi personalizzati alle voci di menu senza plug-in che è molto utile come appare in WordPress 3.6+ non dobbiamo più fare camminatori complessi lunghi e invece possiamo usare questo: http://codex.wordpress.org/Plugin_API / Filter_Reference / nav_menu_link_attributes

Tuttavia, a partire da questo momento, il riferimento all'API è piuttosto scarso e non offre esempi e poiché è così nuovo, Google ha pochissimi riferimenti ad esso.

Ho provato prima questo:

add_filter( 'nav_menu_link_attributes', 'mywp_contact_menu_atts', 10, 3 );

function pb_contact_menu_atts( $atts, $item, $args )
{
    // inspect $item, then …
    $atts['data-toggle'] = 'modal';
    return $atts;
}

e che funziona comunque, come previsto, aggiunge l'attributo a tutti i tag a nel menu. Quindi sto cercando di capire come scegliere come target una voce di menu con # menu-item-7857 a o simili.

Qualcuno sa dove trovare un esempio di targeting di una voce di menu o in grado di determinare come basare sulle informazioni che si trovano nel riferimento API collegato sopra?

Da notare, ho trovato il seguente esempio, ma si rivolge solo a elementi che hanno figli che non aiutano ma che potrebbero essere nella giusta direzione:

add_filter('nav_menu_link_attributes', function($atts, $item, $args) {
    if ( $args->has_children )
    {
        $atts['data-toggle'] = 'dropdown';
        $atts['class'] = 'dropdown-toggle';
    }

    return $atts;
}, 10, 3);

AGGIORNAMENTO - L'unica risposta di seguito suona come se fosse su qualcosa ma da esso non è stato in grado di determinare come trovare effettivamente il numero per indirizzare il mio link specifico e dove / come aggiungere quel condizionale in un esempio funzionante. Aggiunto un commento ma non ho avuto risposta. Da circa 18 giorni ho pensato di vedere se una taglia avrebbe aiutato.

Quando guardo il codice per il link che voglio targetizzare:

<li id="menu-item-7858" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-7858"><a href="#" data-toggle="modal">Chat</a></li>

Vedo il numero 7858 quindi pensando che forse è il numero che dovrei prendere di mira.

Ma quando provo ad esempio:

add_filter( 'nav_menu_link_attributes', 'my_chat_menu_atts', 10, 3 );


function my_chat_menu_atts( $atts, $item, $args ) {
    if ( 7857 == $item['ID'] ) {
        // inspect $item, then …
        $atts['onclick'] = 'SnapEngage.startLink();';
        return $atts;
    }
}

Tuttavia, aggiungendo che se l'istruzione ha suggerito un commentatore, ottengo il seguente errore:

Fatal error: Cannot use object of type WP_Post as array

Suppongo che sia richiesto più codice, ma che sia perso. Come promemoria senza l'istruzione if funziona, tuttavia è indirizzato a tutti i collegamenti anziché a quello a cui voglio rivolgermi.


Voglio inserire <? Php the_id ();?> Nella variabile $ atts. Qualcosa del genere // ispeziona $ item if ($ item-> ID == $ menu_target) {$ atts ['data-toggle'] = 'modal - <? php the_id ();?>'; } restituisce $ atts; Potete per favore aiutarmi come posso inserire the_id nella variabile $ atts. Grazie
nadzhq,

Risposte:


36

In particolare la modifica del codice fornito nella domanda originale:

add_filter( 'nav_menu_link_attributes', 'wpse121123_contact_menu_atts', 10, 3 );
function wpse121123_contact_menu_atts( $atts, $item, $args )
{
  // The ID of the target menu item
  $menu_target = 123;

  // inspect $item
  if ($item->ID == $menu_target) {
    $atts['data-toggle'] = 'modal';
  }
  return $atts;
}

Dopo aver scambiato alcuni dei miei valori che l'hanno fatto! Grazie! Lo ha contrassegnato come corretto, ma dice che devo aspettare altre 23 ore prima di poter assegnare la taglia.
cchiera,

Felice di aiutare! : D
Jen,

Ho impostato un promemoria in Fantastical in modo da non dimenticare di assegnare la taglia domani.
cchiera,

Cosa succede se si hanno più voci di menu come target?
Eric Mitjans,

usa più istruzioni if ​​se il valore di attivazione / disattivazione dei dati è diverso. Oppure puoi salvare l'id nella chiave dell'array (considerando che sono univoci) e il nome modale come valore dell'array. Quindi controlla l'istruzione if conarray_key_exists()
Sisir,

8

Il secondo $itemargomento, che viene reso disponibile per la funzione di filtro, contiene un oggetto voce di menu. Se scaricato, sembra qualcosa del genere:

[1] => WP_Post Object
    (
        [ID] => 2220
        [post_author] => 1
        [post_date] => 2012-12-26 19:29:44
        [post_date_gmt] => 2012-12-26 17:29:44
        [post_content] => 
        [post_title] => Home
        [post_excerpt] => 
        [post_status] => publish
        [comment_status] => open
        [ping_status] => open
        [post_password] => 
        [post_name] => home-3
        [to_ping] => 
        [pinged] => 
        [post_modified] => 2013-06-05 01:55:20
        [post_modified_gmt] => 2013-06-04 22:55:20
        [post_content_filtered] => 
        [post_parent] => 0
        [guid] => http://dev.rarst.net/?p=2220
        [menu_order] => 1
        [post_type] => nav_menu_item
        [post_mime_type] => 
        [comment_count] => 0
        [filter] => raw
        [db_id] => 2220
        [menu_item_parent] => 0
        [object_id] => 2220
        [object] => custom
        [type] => custom
        [type_label] => Custom
        [title] => Home
        [url] => http://dev.rarst.net/
        [target] => 
        [attr_title] => 
        [description] => 
        [classes] => Array
            (
                [0] => 
                [1] => menu-item
                [2] => menu-item-type-custom
                [3] => menu-item-object-custom
                [4] => current-menu-item
                [5] => current_page_item
                [6] => menu-item-home
            )

        [xfn] => 
        [current] => 1
        [current_item_ancestor] => 
        [current_item_parent] => 
    )

Per scegliere come target una voce di menu specifica, è necessario formulare la propria condizione e verificarla, ad esempio, con i dati disponibili nell'oggetto if ( 2220 == $item['ID'] )


Grazie per questo! Non sono del tutto sicuro di capire come ottenere l'ID $ item per la mia particolare voce di menu. Nel tuo esempio, il 2220 è uguale al tuo URL " dev.rarst.net/?p=2220 ". Il mio link a cui voglio aggiungere l'attributo data non va in un altro URL wordpress ma piuttosto è href = "# ContactForm". Sulla base del tuo esempio sopra ho cercato su google e ho provato a eseguire echo var_export ($ GLOBALS ['post'], TRUE); ma quando guardo vicino alla voce di menu personalizzata non vedo alcun ID univoco. Puoi chiarire? O in "if (2220 == $ item ['ID'])" Grazie in anticipo!
cchiera,

2
L'errore che vedi è perché $itemè un oggetto, non un array; cambia $item['ID']in $item->ID.
Jen,

1

Perché non affronti questo problema da una direzione diversa? Anziché tentare di scegliere come target la voce di menu con id == ?? che potrebbe cambiare ad un certo punto (la voce di menu, non l'id), utilizzare l'area Amministratore WP per aggiungere una classe personalizzata alla voce di menu che si desidera targetizzare. Quindi utilizza quella classe nel tuo Javascript per attivare le informazioni necessarie:

$('.my-class').click(function(e){
  // do other stuff
  e.preventDefault;
});

Il mio javascript non è garantito. Se non stai usando jQuery, puoi provare questo .


1

Volevo aggiungere lettere di dati al menu personalizzato che avevo creato in WordPress.

I passi che ho scelto sono stati:

  1. Ho trovato il numero ID del mio menu.
  2. ha aggiunto quelle righe di codice da @guiniveretoo
  3. ha scritto istruzioni if ​​per ciascuna voce di menu (come volevo che venissero iniettati valori di attributo diversi).
  4. lavorato!

Ecco il mio codice

add_filter( 'nav_menu_link_attributes', 'wpse121123_contact_menu_atts', 10, 3 );
function wpse121123_contact_menu_atts( $atts, $item, $args )
{  
  $menu_target = 6;

  if ($item->ID == $menu_target) {
    $atts['data-letters'] = 'PROJECTS';
  }

  elseif ($item->ID == 7) {
    $atts['data-letters'] = 'RESUME';
  }
  elseif ($item->ID == 8) {
    $atts['data-letters'] = 'ARTWORKS';
  }
  elseif ($item->ID == 9) {
    $atts['data-letters'] = 'HELLO!';
  }
  return $atts;
}

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.