【问题标题】:How to modify url in wp_nav_menu?如何修改 wp_nav_menu 中的 url?
【发布时间】:2013-09-18 01:44:58
【问题描述】:

我有:

wp_nav_menu(array(
            'theme_location' => 'header-menu',
            'depth' => 1,
            'container' => 'div',
            'link_before'     => '',
            'link_after'      => '',
        )
);

这给了我:

<ul>
    <li class="page_item page-item-1">
        <a href="http://link1">link1</a>
    </li>
    <li class="page_item page-item-2">
        <a href="http://link2">link2</a>
    </li>
    <li class="page_item page-item-3">
        <a href="http://link3">link3</a>
    </li>
</ul>

但我想替换链接中的 url:

"http://link*" 

到:

"javascript:myfunc('http://link*')";

怎么做?

【问题讨论】:

  • 你能使用jQuery还是必须在服务器端完成?

标签: wordpress wordpress-theming


【解决方案1】:

我想我会尝试使用 PHP DomDocument 将 HTML 解析为字符串并替换 href 属性的值。

$content = '
    <ul>
        <li class="page_item page-item-1">
            <a href="http://link1">link1</a>
        </li>
        <li class="page_item page-item-2">
            <a href="http://link2">link2</a>
        </li>
        <li class="page_item page-item-3">
            <a href="http://link3">link3</a>
        </li>
    </ul>
';

// New Dom Object
$dom = new DomDocument;

// Load $content as string
$dom->loadHTML($content);

// Get only a elements
$elements = $dom->getElementsByTagName('a');

// Loop through each a element and get it's href value
for ($n = 0; $n < $elements->length; $n++) {
    $item = $elements->item($n);

    // Get old href val
    $old_href = $item->getAttribute('href');

    // New href val
    $new_href = 'javascript:myfunc(\''.$old_href.'\')';

    // Replace old href with new
    $content = str_replace($old_href,$new_href,$content);
}

// Print results
echo $content;

【讨论】:

  • 我尝试使用过滤器wp_get_nav_menu_items ,但它正在剥离 JavaScript。将所有这些代码包装在一个函数中,对于这种情况和其他类似情况,这是一个非常好的解决方案。 +1
  • @brasofilo 啊,这很有趣。您的解决方案的链接对我来说看起来足够理智 - 我想知道为什么它会剥离 JS?
  • 我相信它在链接上运行esc_url_raw,在wp-includes/nav-menu.php。有一个动作钩子,wp_update_nav_menu_item,可能有用,但我会把它留给另一个场合。
【解决方案2】:

将以下内容添加到您的 functions.php 文件中,该文件使用 wp_nav_menu_objects 过滤器挂钩连接到 WP Core。

function modify_nav_url($items) {
    $old_url = "http://link*";
    $new_url = "javascript:myfunc('http://link*')";

    foreach($items as $item){
        $item->url = str_replace($old_url, $new_url, $item->url);
    }
    return $items;
}
add_filter('wp_nav_menu_objects', 'modify_nav_url');

来源:https://wordpress.stackexchange.com/questions/137732/change-menu-items-url

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 2018-07-03
    • 2018-09-21
    • 1970-01-01
    • 2022-06-11
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多