WP Nav menu append to url

时间:2013-02-17 作者:M Khalid Junaid

使用wp_nav_menu() , 如何在每个URL的末尾附加值
例如,我有以下url:http://www.example.com/ 但我必须在末尾附加一个语言参数,因此url应该是:http://www.example.com/?lang=$language

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()

结束

相关推荐

Rewriting URLs in Wordpress

我试图解决一个重写问题,但不完全理解如何阅读下面的代码。我相信event/industry/(.+)/?$\' 正在声明重写后新url中所需的格式,这应该是示例。com/事件/行业/某些术语/这部分似乎就是参数。=> \'index.php?post_type=eg_event&industry=\' . $wp_rewrite->preg_index(1)这是正确的理解吗?是什么告诉代码在我的新url中放置什么值,这是什么:(.+)/?$\' 是不是$wp_rewrite-