Link-ID in der WordPress-URL

Lesezeit: 4 Minuten

Benutzer-Avatar
Jeramai

Derzeit arbeite ich an einer WordPress-Website, aber ich bin auf ein kleines Problem gestoßen.

ich benutze wp_page_menu um eine Navigationsleiste zu erstellen, um zu meinen anderen Seiten zu gelangen. Jetzt leitet es mich an www.mysite.com/sportaber ich brauche es, um mich dorthin zu lenken www.mysite.com/sport#header oder www.mysite.com/sport/#header.

Weiß jemand wie ich das machen kann?

Ich habe versucht, verschiedene Plugins zu verwenden oder den Slug oder Permalink zu ändern, aber das hat mir nicht das gewünschte Ergebnis gebracht.

Danke für die Hilfe Jungs!

  • Benötigen Sie es für alle Links oder nur für einen einzelnen Link?

    – Stewartside

    30. April 2015 um 8:53 Uhr

  • @Stewartside Auf allen Links wäre ein anderer am besten, aber auf allen Links könnte auch das gleiche funktionieren

    – Jeramai

    30. April 2015 um 8:55 Uhr

  • Warum nicht einfach ein benutzerdefiniertes Menü im Admin erstellen? Anstatt eine Funktion zu verwenden, um die Seiten abzurufen, können Sie sie manuell mit dem Menüelementtyp “Link” verlinken … Klingt einfacher als die Alternative.

    – rnevius

    30. April 2015 um 9:11 Uhr

  • @rnevius Ich hatte gehofft, das zu vermeiden. Nun, wenn es nicht wirklich etwas gibt, was ich dagegen tun könnte, dann denke ich, ich sollte mit einem benutzerdefinierten Menü gehen.

    – Jeramai

    30. April 2015 um 9:18 Uhr

Benutzer-Avatar
Christian Nguyen

OK. Hier ist Ihr Code. Ich überschreibe einfach den Standard-Walker von WordPress. Bitte konzentrieren Sie sich in diesem Code auf den Text #header.

Wenn Sie sich Sorgen um diesen Code machen. Sie können also zur Datei gehen: …wp-includes/post-template.php in Zeile 1238. Es ist derselbe Code, aber ich habe #header nach get_permalink() hinzugefügt.

Hoffe das hilft.

 class WPSE_HasHeader_Custom_Walker extends Walker_Page {


        function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) {

            if ( $depth )
                $indent = str_repeat("\t", $depth);
            else
                $indent="";

            extract($args, EXTR_SKIP);
            $css_class = array('page_item', 'page-item-'.$page->ID);

            if( isset( $args['pages_with_children'][ $page->ID ] ) )
                $css_class[] = 'page_item_has_children';

            if ( !empty($current_page) ) {
                $_current_page = get_post( $current_page );
                if ( in_array( $page->ID, $_current_page->ancestors ) )
                    $css_class[] = 'current_page_ancestor';
                if ( $page->ID == $current_page )
                    $css_class[] = 'current_page_item';
                elseif ( $_current_page && $page->ID == $_current_page->post_parent )
                    $css_class[] = 'current_page_parent';
            } elseif ( $page->ID == get_option('page_for_posts') ) {
                $css_class[] = 'current_page_parent';
            }

            $css_class = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) );

            if ( '' === $page->post_title )
                $page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );

            /** CHANGE LINK HERE **/
            $output .= $indent . '<li class="' . $css_class . '"><a href="' . get_permalink($page->ID) . '#header">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

            if ( !empty($show_date) ) {
                if ( 'modified' == $show_date )
                    $time = $page->post_modified;
                else
                    $time = $page->post_date;

                $output .= " " . mysql2date($date_format, $time);
            }
        }
    }

    wp_list_pages(array(
        'sort_column' => 'menu_order',
        'title_li'    => '',
        'echo'        => 1,
        'walker' => new WPSE_HasHeader_Custom_Walker()
    ));

Aktualisiert:

Der zweite Weg: Dank Mere Development. Ich denke, das ist die gleiche Idee wie bei ihm, aber in Ihrem Fall ist es viel einfacher. So was:

$link = wp_list_pages(array(
                        'sort_column' => 'menu_order',
                        'title_li'    => '',
                        'echo'        => 0,
                    ));
echo preg_replace('/<a(.*)href="https://stackoverflow.com/questions/29963139/([^"]*)"(.*)>/', '<a$1href="$2#header"$3>', $link);

  • Nett! Wusste nicht wp_page_menu könnte einen Walker verwenden, es ist nicht dokumentiert. noch.

    – Bloße Entwicklung

    30. April 2015 um 11:08 Uhr

Christians Antwort ist großartig und hat mich dazu gebracht, über alternative Möglichkeiten nachzudenken, insbesondere über solche, die es Ihnen ermöglichen, Ihre zu verwenden wp_page_menu() funktionieren wie ursprünglich gewünscht. Hier ist also ein anderer Ansatz mit einem Filter.

Fügen Sie diese Funktion vor Ihrer hinzu wp_page_menu() Aufruf oder in der functions.php

function wp_list_pages_addhash($output) {
    $dom = new DOMDocument;
    $dom->loadHTML($output);
    $links = $dom->getElementsByTagName('a');
    foreach ($links as $link) {
      $link->setAttribute('href', $link->getAttribute('href') . '#header');
    }
    $output = $dom->saveHTML();
    return $output;
}
add_filter('wp_list_pages', 'wp_list_pages_addhash');

Verwenden Sie dann Ihren wp_page_menu-Aufruf so, wie Sie ihn ursprünglich in Ihrem Design verwendet haben:

wp_page_menu();

Erläuterung: Es findet jedes href-Attribut jedes Links in der Ausgabe von wp_list_pages und fügt am Ende ‘#header’ hinzu. wp_page_menu wiederum nutzt wp_list_pages Ausgabe zu erstellen.

1271450cookie-checkLink-ID in der WordPress-URL

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

Privacy policy