使用wp_nav_menu()
, 如何在每个URL的末尾附加值
例如,我有以下url:http://www.example.com/
但我必须在末尾附加一个语言参数,因此url应该是:http://www.example.com/?lang=$language
WP Nav menu append to url
3 个回复
最合适的回答,由SO网友:M Khalid Junaid 整理而成
我找到了改变wp_nav_menu
使用wp_get_nav_menu_items-filter
. 下面是一个比较完整的示例:
class ModifyLinkFilter {
protected $_prio = 10;
protected $_args;
public function __construct($addargs = array(), $prio = 10) {
$this->_args = $addargs;
$this->_prio = $prio;
if(!empty($addargs)) {
$this->register();
}
}
public function register() {
add_filter(\'wp_get_nav_menu_items\',
array($this, \'on_nav_items\'), $this->_prio, 3);
}
public function unregister() {
remove_filter(\'wp_get_nav_menu_items\',
array($this, \'on_nav_items\'), $this->_prio, 3);
}
public function on_nav_items($items, $menu, $args) {
foreach($items as $item) {
if(!empty($item->url)) {
$item->url = self::modifyUrlSimple($item->url, $this->_args);
}
}
return $items;
}
public static function modifyUrlSimple($url, $query) {
$url .= strchr($url, \'?\') === false ? \'?\' : \'&\';
$url .= http_build_query($query);
return $url;
}
}
// You can use the class like that
$language = "de";
$args = array(\'lang\' => $language, \'foo\' => \'bar\');
$linkfilter = new ModifyLinkFilter($args);
wp_nav_menu();
$linkfilter->unregister();
这将修改导航菜单中的每个项目。因此,如果您有一个外部链接,它也会被更改。此外,修改URL并不像看起来那么容易。项目的URL可以是/blabla?myvalue=5#anchor
看起来像是/blabla?myvalue=5#anchor&lang=de&foo=bar
修改后。
SO网友:david.binda
您可以使用whole custom Walker - see codex 或者只是对walker_nav_menu_start_el
重新生成链接。
对于过滤器,您的代码位于主题函数中。php如下所示:
add_filter( \'walker_nav_menu_start_el\', \'my_language_link_function\', 10, 4 );
function my_language_link_function( $item_output, $item, $depth, $args ){
$indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';
$class_names = $value = \'\';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = \'menu-item-\' . $item->ID;
$class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item, $args ) );
$class_names = $class_names ? \' class="\' . esc_attr( $class_names ) . \'"\' : \'\';
$id = apply_filters( \'nav_menu_item_id\', \'menu-item-\'. $item->ID, $item, $args );
$id = $id ? \' id="\' . esc_attr( $id ) . \'"\' : \'\';
$output .= $indent . \'<li\' . $id . $value . $class_names .\'>\';
$attributes = ! empty( $item->attr_title ) ? \' title="\' . esc_attr( $item->attr_title ) .\'"\' : \'\';
$attributes .= ! empty( $item->target ) ? \' target="\' . esc_attr( $item->target ) .\'"\' : \'\';
$attributes .= ! empty( $item->xfn ) ? \' rel="\' . esc_attr( $item->xfn ) .\'"\' : \'\';
//Your code generationg lang parameter goes here:
$attributes .= ! empty( $item->url ) ? \' href="\' . esc_attr( $item->url ) .\'"\' : \'\';
$item_output = $args->before;
$item_output .= \'<a\'. $attributes .\'>\';
$item_output .= $args->link_before . apply_filters( \'the_title\', $item->title, $item->ID ) . $args->link_after;
$item_output .= \'</a>\';
$item_output .= $args->after;
return $item_output;
}
此代码是Walker\\u Nav\\u菜单类的start\\u el函数的副本,您可以在wp-includes/nav-menu-template.php - 查看代码。SO网友:zonay
下面是一个示例,如果有人需要使用javascript实现这一点;jQuery:
$(\'.menu-item).each(function () {
currentHref = $(this).attr(\'href\');
var jsUrlObj = new URL(currentHref);
jsUrlObj.searchParams.append(\'lang\', \'en\')
$(this).attr(\'href\', jsUrlObj);
})
有关详细信息:URLSearchParams.append()结束