我正在寻找一种方法来创建一个可以添加到菜单中的新项目。
以下是我的问题的详细信息:我使用WPML。 WPML具有很好的功能,您可以自动将切换器添加到菜单中。它在菜单的末尾添加它,无法控制它。
事情是,我希望我的语言切换器成为6中的元素4.在最后自动添加元素的功能不符合我的需要。
所以我想创建一个可以在appence - >菜单中使用的新元素,将我的语言切换器准确地放在我想要的位置。
有没有办法做到这一点?
TLDR:我希望能够在菜单元素(Apparence-> Menu)中推送自定义HTML / PHP代码。有没有这样做的功能?
答案 0 :(得分:3)
来自wp-includes/nav-menu-template.php
,Walker_Nav_Menu::start_el
:
/**
* Filter a menu item's starting output.
*
* The menu item's starting output only includes `$args->before`, the opening `<a>`,
* the menu item's 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's 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
)来验证当前的渲染导航菜单。
答案 1 :(得分:1)
好的,我有临时解决方案。
以下是步骤:
\wp-content\plugins\sitepress-multilingual-cms\inc\language-switcher.php
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
设置为空字符串
为什么?因为现在我们可以将widget作为第一个菜单项或在某些菜单项之间插入。
然后我们爆炸$tempitems
字符串,以便我们可以使用其他订单。
当您现在指定$id
时,这将成为我们的偏移量。
现在在第一个循环中,在$id
的帮助下,我们将一些临时项添加到空$items
字符串,然后添加语言小部件和最后剩余的菜单项。
答案 2 :(得分:-2)
即使您使用的是预先制定的theme
或template
,也可以创建新模板。
只需从您要使用的模板中复制代码,然后在localhost
上进行相应修改,然后将修改后的副本上传到主题目录。
请确保保留副本,以防将主题更新为较新版本,因为它会被覆盖。
另一种选择是开发child theme。