ID на връзката в URL адреса на wordpress

В момента работя върху уебсайт на wordpress, но се натъкнах на малък проблем.

Използвам wp_page_menu, за да направя навигационна лента, за да стигна до другите си страници. Сега ме насочва към www.mysite.com/sport, но имам нужда да ме насочва към www.mysite.com/sport#header или www.mysite.com/sport/#header.

Някой знае ли как мога да направя това?

Опитах да използвам различни плъгини или да сменя slug или permalink, но това не ми даде желания резултат.

Благодаря за помощта момчета!


person Jeramai    schedule 30.04.2015    source източник
comment
Имате ли нужда от него на всички връзки или само на една връзка?   -  person Stewartside    schedule 30.04.2015
comment
@Stewartside За всички връзки различна би била най-добрата, но за всички връзки едно и също може да работи   -  person Jeramai    schedule 30.04.2015
comment
Защо просто не направите персонализирано меню в Админ? Вместо да използвате функция за получаване на страниците, можете ръчно да се свържете към тях, като използвате типа елемент от менюто Link... Звучи по-лесно от алтернативата.   -  person rnevius    schedule 30.04.2015
comment
@rnevius Надявах се да избегна това.. Е, ако наистина не мога да направя нищо по въпроса, тогава мисля, че трябва да отида с персонализирано меню..   -  person Jeramai    schedule 30.04.2015


Отговори (2)


Добре. Ето вашия код. Просто отменям програмата по подразбиране на wordpress. Моля, фокусирайте се върху текста #header в този код.

Ако се притеснявате за този код. Така че можете да отидете на файл: ...wp-includes/post-template.php на ред 1238. Същият код, но имам добавяне на #header след get_permalink().

Надявам се това да помогне.

 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="/bg' . 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()
    ));

Актуализирано:

Вторият начин: Благодаря Mere Development. Мисля, че това е същата идея с него, но е много по-просто във вашия случай. Като този:

$link = wp_list_pages(array(
                        'sort_column' => 'menu_order',
                        'title_li'    => '',
                        'echo'        => 0,
                    ));
echo preg_replace('/<a(.*)href="/bg([^"]*)"(.*)>/', '<a$1href="/bg$2#header"$3>', $link);
person christian Nguyen    schedule 30.04.2015
comment
хубаво! Не знаех, че wp_page_menu може да използва Walker, не е документиран. още. - person Mere Development; 30.04.2015

Отговорът на Кристиан е страхотен и ме накара да се замисля за алтернативни начини да направя това, особено такива, които ви позволяват да използвате вашата wp_page_menu() функция, както е първоначално поискано. И така, ето друг подход, използващ филтър.

Добавете тази функция преди вашето wp_page_menu() повикване или във 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');

След това използвайте извикването на wp_page_menu, както първоначално сте били във вашата тема:

wp_page_menu();

Обяснение: Намира всеки href атрибут на всяка връзка в изхода на wp_list_pages и добавя '#header' в края. wp_page_menu от своя страна използва wp_list_pages за създаване на изход.

person Mere Development    schedule 30.04.2015