Фильтр для удаления заголовка и строки-разделителя wordpress

#php #string #wordpress #filter

#php #строка #wordpress #Фильтр

Вопрос:

Я хотел бы заменить часть этой строки:

 $title = implode( " $sep ", array_filter( $title ) );
  

Полная функция здесь:

 function wp_get_document_title() {
$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

global $page, $paged;

$title = array(
    'title' => '',
);

if ( is_404() ) {
    $title['title'] = __( 'Page not found' );
} elseif ( is_search() ) {
    $title['title'] = sprintf( __( 'Search Results for amp;#8220;%samp;#8221;' ), get_search_query() );
} elseif ( is_front_page() ) {
    $title['title'] = get_bloginfo( 'name', 'display' );
} elseif ( is_post_type_archive() ) {
    $title['title'] = post_type_archive_title( '', false );
} elseif ( is_tax() ) {
    $title['title'] = single_term_title( '', false );
} elseif ( is_home() || is_singular() ) {
    $title['title'] = single_post_title( '', false );
} elseif ( is_category() || is_tag() ) {
    $title['title'] = single_term_title( '', false );
} elseif ( is_author() amp;amp; $author = get_queried_object() ) {
    $title['title'] = $author->display_name;
} elseif ( is_year() ) {
    $title['title'] = get_the_date( _x( 'Y', 'yearly archives date format' ) );
} elseif ( is_month() ) {
    $title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) );

} elseif ( is_day() ) {
    $title['title'] = get_the_date();
}

if ( ( $paged >= 2 || $page >= 2 ) amp;amp; ! is_404() ) {
    $title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
}

if ( is_front_page() ) {
    $title['tagline'] = get_bloginfo( 'description', 'display' );
} else {
    $title['site'] = get_bloginfo( 'name', 'display' );
}

$sep = apply_filters( 'document_title_separator', '-' );

$title = apply_filters( 'document_title_parts', $title );

$title = implode( " $sep ", array_filter( $title ) );
$title = wptexturize( $title );
$title = convert_chars( $title );
$title = esc_html( $title );
$title = capital_P_dangit( $title );

return $title;
}

function _wp_render_title_tag() {
    if ( ! current_theme_supports( 'title-tag' ) ) {
        return;
    }
    echo '<title>' . wp_get_document_title() . '</title>' . "n";
}
  

Однако это находится под wp-includes/general-template.php , и я хотел бы отфильтровать это через мой functions.php , чтобы не повлиять на основной файл.

Есть ли способ, которым я мог бы отфильтровать пробелы до и после $sep функции? По сути, я хочу, чтобы заголовок изменился по соображениям SEO, и только разделитель исчез на главной странице.. что-то в этом роде (это, конечно, не работает):

 <?php if ( is_front_page() ) { 
    $title = implode( "", array_filter( $title ) ); 
} else { 
    $title = implode( " $sep ", array_filter( $title ) ); 
} ?>
  

Есть ли способ отфильтровать это или использовать str_replace ?

Комментарии:

1. $sep там не определено, поэтому, что бы вы ни пытались с этим сделать, это не сработает.

2. Возможно, есть ответ (это немного взлом), но, чтобы дать вам хороший ответ, в этом вопросе отсутствует важная часть: где это вызывается? Есть ли у вас доступ к полной строке ПОСЛЕ ее вызова?

3. @cale_b спасибо, я добавил туда полную функцию

4. В вашем is_front_page()... коде выше вы передаете $ sep — где это определено?

5. @cale_b $sep определяется в function wp_get_document_title() нескольких строках над строкой, которую я хотел бы изменить

Ответ №1:

Попробуйте document_title_separator фильтр и pre_get_document_title в WordPress 4.4 .

Устанавливаем разделитель на что-то вроде $% затем используем его в сочетании с preg_replace . Затем вы можете сопоставить шаблон с добавленными пробелами, например '/ $% /' , против всего заголовка.

В functions.php :

 <?php

if ( is_front_page() ) {
    add_filter('pre_get_document_title', 'theme_mod_title');
}

function theme_mod_title() {

    add_filter('document_title_separator', function() {
        return '$%';
    });

    remove_filter('pre_get_document_title', 'theme_mod_title');

    $pattern = '/ $% /';
    $desired = '-';
    $title = wp_get_document_title();

    return preg_replace($pattern, $desired, $title);
}
  

Комментарии:

1. Не будет этого делать, потому что $title = implode( «$ sep «, array_filter( $title ) ); появляется после document_title_separator

2. @Kevin Я воздерживаюсь от изменения формы general-template.php поскольку это основной файл, именно поэтому я хотел бы отфильтровать functions.php

3. Спасибо, Кевин, это отлично сработало в сочетании с if ( is_front_page() ) { } вызовом