Создание нового пункта меню - Wordpress
Я ищу способ создать новый элемент, который можно добавить в меню.
Вот подробности моей проблемы: я использую WPML. WPML имеет такую приятную функцию, что вы можете добавить коммутатор в меню автоматически. Он добавляет его в конце меню, не контролируя его.
Thing is, я хочу, чтобы мой языковой коммутатор был элементом 4 из 6. Эта функция автоматического добавления элемента в конце не соответствует моим потребностям.
Итак, я хочу создать новый элемент, который можно использовать в menu- > menu, чтобы поместить мой языковой переключатель точно в то место, которое я хочу.
Есть ли способ сделать это?
TL;DR: я хочу иметь возможность нажимать собственный код HTML/PHP в элементе меню (Apparence- > Menu). Любые функции для этого?
Ответы
Ответ 1
Вы можете создать новый шаблон, даже если вы используете предварительно разработанные theme
или template
.
Просто скопируйте код из шаблона, который вы хотите использовать, и соответствующим образом измените его на localhost
и загрузите измененную копию в каталог темы.
Убедитесь, что вы сохранили копию, если вы обновите тему до более новой версии, потому что она будет перезаписана.
Другой вариант - создать дочернюю тему .
Ответ 2
От wp-includes/nav-menu-template.php
, в Walker_Nav_Menu::start_el
:
/**
* Filter a menu item starting output.
*
* The menu item starting output only includes `$args->before`, the opening `<a>`,
* the menu item title, the closing `</a>`, and `$args->after`. Currently, there is
* no filter for modifying the opening and closing `<li>` for a menu item.
*
* @since 3.0.0
*
* @param string $item_output The menu item starting HTML output.
* @param object $item Menu item data object.
* @param int $depth Depth of menu item. Used for padding.
* @param array $args An array of {@see wp_nav_menu()} arguments.
*/
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
Это означает, что вы можете добавить к содержимому HTML-содержимого отдельного навигационного меню (прямо перед последним тегом li
) с помощью этого фильтра. $item_output
содержит HTML, сгенерированный для элемента до сих пор. Пример:
<?php
add_filter('walker_nav_menu_start_el', function ($item_output) {
return $item_output . '<span>hello world</span>';
});
Это добавит <span>hello world</span>
к каждому элементу меню навигации HTML. После этого фильтра будет добавлен тег закрытия li
. Вы можете использовать 4-й аргумент ($args
) для проверки текущего навигационного меню.
Ответ 3
Хорошо, у меня есть временное решение.
Это шаги:
- Открыть
\wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
- Перейдите куда-нибудь по строке 786, где
function wp_nav_menu_items_filter($items, $args){
-
Добавьте это право после первого {
:
$tempitems = $items;
$tempitemsexplode = explode("\n", $tempitems);
$items = "";
$id = 2; //This is where widget will be located: example, if you want it to be at place 4, write 5
-
Прямо перед if ( $abs_menu_id == $settings_menu_id || false === $abs_menu_id ) {
добавьте это:
$id = 2;
for ($i = 0; $i < $id; $i++){
$items .= $tempitemsexplode[$i];
}
for($i = 0; $i < count($tempitemsexplode); $i++){
If ($i == $id){
-
В нижней части функции и до:
}
return $items;
Добавить: }}
-
Теперь, перед return $items;
Добавить:
for ($i = $id; $i < count($tempitemsexplode); $i++){
$items .= $tempitemsexplode[$i];
}
Если вы застряли здесь, то, как вся эта функция ищет меня:
function wp_nav_menu_items_filter($items, $args){
$tempitems = $items;
$tempitemsexplode = explode("\n", $tempitems);
$items = "";
global $sitepress_settings, $sitepress;
$current_language = $sitepress->get_current_language();
$default_language = $sitepress->get_default_language();
// menu can be passed as integer or object
if(isset($args->menu->term_id)) $args->menu = $args->menu->term_id;
$abs_menu_id = icl_object_id($args->menu, 'nav_menu', false, $default_language );
$settings_menu_id = icl_object_id( $sitepress_settings[ 'menu_for_ls' ], 'nav_menu', false, $default_language );
$id = 2;
for ($i = 0; $i < $id; $i++){
$items .= $tempitemsexplode[$i];
}
for($i = 0; $i < count($tempitemsexplode); $i++){
If ($i == $id){
if ( $abs_menu_id == $settings_menu_id || false === $abs_menu_id ) {
$languages = $sitepress->get_ls_languages();
$items .= '<li class="menu-item menu-item-language menu-item-language-current">';
if(isset($args->before)){
$items .= $args->before;
}
$items .= '<a href="#" onclick="return false">';
if(isset($args->link_before)){
$items .= $args->link_before;
}
$language_name = '';
if ( $sitepress_settings[ 'icl_lso_native_lang' ] ) {
$language_name .= $languages[ $current_language ][ 'native_name' ];
}
if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
$language_name .= ' (';
}
if ( $sitepress_settings[ 'icl_lso_display_lang' ] ) {
$language_name .= $languages[ $current_language ][ 'translated_name' ];
}
if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
$language_name .= ')';
}
$alt_title_lang = esc_attr($language_name);
if( $sitepress_settings['icl_lso_flags'] ){
$items .= '<img class="iclflag" src="' . $languages[ $current_language ][ 'country_flag_url' ] . '" width="18" height="12" alt="' . $alt_title_lang . '" title="' . esc_attr( $language_name ) . '" />';
}
$items .= $language_name;
if(isset($args->link_after)){
$items .= $args->link_after;
}
$items .= '</a>';
if(isset($args->after)){
$items .= $args->after;
}
unset($languages[ $current_language ]);
$sub_items = false;
$menu_is_vertical = !isset($sitepress_settings['icl_lang_sel_orientation']) || $sitepress_settings['icl_lang_sel_orientation'] == 'vertical';
if(!empty($languages)){
foreach($languages as $lang){
$sub_items .= '<li class="menu-item menu-item-language menu-item-language-current">';
$sub_items .= '<a href="'.$lang['url'].'">';
$language_name = '';
if ( $sitepress_settings[ 'icl_lso_native_lang' ] ) {
$language_name .= $lang[ 'native_name' ];
}
if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
$language_name .= ' (';
}
if ( $sitepress_settings[ 'icl_lso_display_lang' ] ) {
$language_name .= $lang[ 'translated_name' ];
}
if ( $sitepress_settings[ 'icl_lso_display_lang' ] && $sitepress_settings[ 'icl_lso_native_lang' ] ) {
$language_name .= ')';
}
$alt_title_lang = esc_attr($language_name);
if( $sitepress_settings['icl_lso_flags'] ){
$sub_items .= '<img class="iclflag" src="'.$lang['country_flag_url'].'" width="18" height="12" alt="'.$alt_title_lang.'" title="' . $alt_title_lang . '" />';
}
$sub_items .= $language_name;
$sub_items .= '</a>';
$sub_items .= '</li>';
}
if( $sub_items && $menu_is_vertical ) {
$sub_items = '<ul class="sub-menu submenu-languages">' . $sub_items . '</ul>';
}
}
if( $menu_is_vertical ) {
$items .= $sub_items;
$items .= '</li>';
} else {
$items .= '</li>';
$items .= $sub_items;
}
}
}
}
for ($i = $id; $i < count($tempitemsexplode); $i++){
$items .= $tempitemsexplode[$i];
}
return $items;
}
Я попытаюсь упростить изменение места размещения виджета.
Комментарий, если у вас есть проблемы. Удачи!
Изменить: Объяснение, что делает эта измененная функция.
Эта функция используется для добавления языкового переключателя в меню.
Когда эта функция вызывается, у нас есть строка $items
, содержащая все пункты меню.
Я переместил все пункты меню из $items
в $tempitems
и установил $items
в пустую строку.
Почему?. Теперь мы можем вставить виджет в качестве первого пункта меню или между некоторыми пунктами меню.
Затем мы взорвали строку $tempitems
, чтобы мы могли использовать другой порядок.
Когда вы укажете $id
, это станет нашим смещением.
И теперь в первом цикле с помощью $id
мы добавляем некоторые временные элементы в пустую строку $items
, а затем - виджет языка и в конце остальных пунктов меню.