Wie ändere ich die URL in wp_nav_menu?

Lesezeit: 2 Minuten

Ich habe:

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

und das gib mir:

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

aber ich möchte die URL in Links ersetzen von:

"http://link*" 

zu:

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

Wie es geht?

  • Können Sie jQuery verwenden oder muss dies serverseitig erfolgen?

    – Joe Schnalle

    13. September 2013 um 12:55 Uhr

Nun, ich dachte, ich würde es mit PHP versuchen DomDocument um den HTML-Code als String zu analysieren und den Wert des href-Attributs zu ersetzen.

$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;

  • Ich habe es mit dem Filter versucht wp_get_nav_menu_items , aber es entfernt das JavaScript. All diesen Code in eine Funktion zu packen, ist eine sehr gute Lösung für diesen und andere ähnliche Fälle. +1

    – Brasilo

    13. September 2013 um 14:31 Uhr

  • @brasofilo Ah, das ist interessant. Der Link zu Ihrer Lösung sieht für mich vernünftig genug aus – ich frage mich, warum er das JS entfernt?

    – Joe Schnalle

    13. September 2013 um 14:43 Uhr

  • Ich glaube es läuft a esc_url_raw auf dem Link, in wp-includes/nav-menu.php. Es gibt einen Action-Hook, wp_update_nav_menu_itemdas könnte von Nutzen sein, aber ich belasse es bei einer anderen Gelegenheit.

    – Brasilo

    13. September 2013 um 14:49 Uhr


Fügen Sie Folgendes zu Ihrer Datei functions.php hinzu, die sich mit dem Filter-Hook wp_nav_menu_objects in WP Core einklinkt.

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');

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

1010920cookie-checkWie ändere ich die URL in wp_nav_menu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy