Cum să adaugi un atribut data la un element de meniu WordPress
Folosesc Twitter Bootstrap și trebuie să adaug atributul data-toggle="modal" la tag-ul a al unui link din meniu. După o căutare, majoritatea rezultatelor fac referire la parcurgerea meniurilor dropdown Twitter Bootstrap, însă acest meniu nu are dropdown-uri și am nevoie doar să adaug acest atribut specific.
Apoi am găsit aceasta: Adăugarea atributelor personalizate la elementele de meniu fără plugin care este foarte utilă deoarece se pare că în WordPress 3.6+ nu mai trebuie să folosim walkere complexe și în schimb putem folosi: http://codex.wordpress.org/Plugin_API/Filter_Reference/nav_menu_link_attributes
Totuși, în prezent această referință API este destul de sumară și nu oferă exemple, iar fiind atât de nouă, există foarte puține referințe despre ea pe Google.
Am încercat mai întâi acest cod:
add_filter( 'nav_menu_link_attributes', 'mywp_contact_menu_atts', 10, 3 );
function pb_contact_menu_atts( $atts, $item, $args )
{
// inspectează $item, apoi ...
$atts['data-toggle'] = 'modal';
return $atts;
}
și funcționează, dar după cum era de așteptat adaugă atributul la toate tag-urile a din meniu. Așa că încerc să înțeleg cum să vizez un singur element de meniu cu #menu-item-7857 a sau similar.
Știe cineva unde pot găsi un exemplu de vizare a unui element de meniu sau poate determina cum să fac acest lucru bazat pe informațiile din referința API linkuită mai sus?
De notat, am găsit următorul exemplu dar vizează doar elementele care au copii, ceea ce nu ajută, dar ar putea fi în direcția corectă:
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);
UPDATE - Singurul răspuns de mai jos pare promițător dar nu am reușit să determin cum să găsesc numărul pentru a viza link-ul meu specific și unde/cum să adaug acea condiție într-un exemplu funcțional. Am adăugat un comentariu dar nu am primit răspuns. Au trecut aproximativ 18 zile și m-am gândit să văd dacă o recompensă ar ajuta.
Când mă uit la codul pentru link-ul pe care vreau să-l vizez:
<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>
Văd numărul 7858 așa că mă gândesc că poate acesta este numărul pe care ar trebui să-l vizez.
Dar când încerc de exemplu:
add_filter( 'nav_menu_link_attributes', 'my_chat_menu_atts', 10, 3 );
function my_chat_menu_atts( $atts, $item, $args ) {
if ( 7857 == $item['ID'] ) {
// inspectează $item, apoi ...
$atts['onclick'] = 'SnapEngage.startLink();';
return $atts;
}
}
Totuși, adăugând acea instrucțiune if sugerată de comentator primesc următoarea eroare:
Fatal error: Cannot use object of type WP_Post as array
Presupun că este nevoie de mai mult cod, dar sunt blocat. Ca reminder, fără instrucțiunea if funcționează, dar vizează toate link-urile în loc de link-ul specific pe care vreau să-l vizez.
Modificând în mod specific codul pe care l-ai furnizat în întrebarea inițială:
add_filter( 'nav_menu_link_attributes', 'wpse121123_contact_menu_atts', 10, 3 );
function wpse121123_contact_menu_atts( $atts, $item, $args )
{
// ID-ul elementului de meniu țintă
$menu_target = 123;
// inspectăm $item
if ($item->ID == $menu_target) {
$atts['data-toggle'] = 'modal';
}
return $atts;
}

După ce am înlocuit cu unele dintre valorile mele, a funcționat! Mulțumesc! Am marcat ca corect, dar spune că trebuie să mai aștept încă 23 de ore înainte să pot acorda recompensa.

Am setat o reamintire în Fantastical ca să nu uit să acord recompensa mâine.

Al doilea argument $item
, care este disponibil pentru funcția ta de filtrare, conține un obiect de element de meniu. Dacă îl afișăm, arată cam așa:
[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] => Acasă
[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] => Personalizat
[title] => Acasă
[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] =>
)
Pentru a ținti un anumit element de meniu, trebuie să formulezi condiția ta și să o verifici împotriva datelor disponibile în obiect, de exemplu if ( 2220 == $item['ID'] )

Mulțumesc pentru asta! Nu sunt sigur că înțeleg cum să obțin ID-ul $item pentru elementul meu specific din meniu. În exemplul tău, 2220 este același cu URL-ul tău "http://dev.rarst.net/?p=2220". Link-ul meu, căruia vreau să-i adaug atributul data, nu duce către un alt URL WordPress, ci are href="#ContactForm". Bazându-mă pe exemplul tău, am căutat mai mult pe Google și am încercat să rulez echo var_export($GLOBALS['post'], TRUE); dar când mă uit în apropierea elementului individual din meniu, nu văd niciun ID unic. Poți să clarifici? Sau în "if ( 2220 == $item['ID'] )" Mulțumesc anticipat!

De ce nu abordezi această problemă dintr-o altă perspectivă? În loc să încerci să ții cont de elementul de meniu cu id == ??, care ar putea fi modificat la un moment dat (elementul de meniu, nu id-ul), folosește zona de administrare WP pentru a adăuga o clasă personalizată elementului de meniu pe care dorești să-l ții cont. Apoi folosește acea clasă în Javascript pentru a declanșa informațiile de care ai nevoie:
$('.my-class').click(function(e){
// faci alte operații
e.preventDefault;
});
Nu garantez că scriptul meu este corect. Dacă nu folosești jQuery, poți încerca această soluție.

Am dorit să adaug atributul data-letters la meniul personalizat pe care l-am creat în WordPress.
Pașii pe care i-am urmat au fost:
- Am găsit numărul ID al meniului meu.
- Am adăugat acele linii de cod de la @guiniveretoo
- Am scris instrucțiuni if pentru fiecare element de meniu (deoarece voiam să injectez valori diferite pentru atribut).
- A funcționat!
Iată codul meu.
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'] = 'PROIECTE';
}
elseif ($item->ID == 7) {
$atts['data-letters'] = 'CV';
}
elseif ($item->ID == 8) {
$atts['data-letters'] = 'LUCRĂRI ARTISTICE';
}
elseif ($item->ID == 9) {
$atts['data-letters'] = 'BUNĂ!';
}
return $atts;
}
Sper că acest lucru vă este de ajutor.
