Идентификатор ссылки в URL WordPress

В настоящее время я работаю над веб-сайтом wordpress, но я наткнулся на небольшую проблему.

Я использую wp_page_menu, чтобы сделать панель навигации, чтобы перейти на другие мои страницы. Теперь он направляет меня к www.mysite.com/sport, но мне нужно, чтобы он направлял меня к www.mysite.com/sport#header или www.mysite.com/sport/#header.

Кто-нибудь знает, как я могу это сделать?

Я пробовал использовать разные плагины, менять слаг или постоянную ссылку, но это не дало мне желаемого результата.

Спасибо за помощь, ребята!


person Jeramai    schedule 30.04.2015    source источник
comment
Вам это нужно для всех ссылок или только для одной?   -  person Stewartside    schedule 30.04.2015
comment
@Stewartside Для всех ссылок лучше всего подойдет другой, но для всех ссылок может работать одно и то же.   -  person Jeramai    schedule 30.04.2015
comment
Почему бы просто не сделать кастомное меню в админке? Вместо того, чтобы использовать функцию для получения страниц, вы можете вручную связать их, используя тип элемента меню «Ссылка»… Звучит проще, чем альтернатива.   -  person rnevius    schedule 30.04.2015
comment
@rnevius Я надеялся избежать этого .. Ну, если я ничего не могу с этим поделать, то я думаю, что мне следует использовать собственное меню ..   -  person Jeramai    schedule 30.04.2015


Ответы (2)


Ok. Вот ваш код. Я просто переопределяю ходок по умолчанию для 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="' . 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()
    ));

Обновлено:

Второй способ: Благодаря простому развитию. Я думаю, что у него такая же идея, но в вашем случае все намного проще. Как это:

$link = wp_list_pages(array(
                        'sort_column' => 'menu_order',
                        'title_li'    => '',
                        'echo'        => 0,
                    ));
echo preg_replace('/<a(.*)href="([^"]*)"(.*)>/', '<a$1href="$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