Как изменить заголовок на конкретной странице в WordPress?
Как можно изменить заголовок на конкретной странице, в адресе которой есть аякс параметры? То есть, вопрос не в том как поменять скажем на отдельной записи или страницы, у которых есть айдишники, а вот в таком формате:
.../candidate/?ajax_filter=true&sort-by=recent&sector_cat=postizhjor&location_location1=abakan&posted=all |
.../candidate/?ajax_filter=true&sort-by=recent&sector_cat=postizhjor&location_location1=abakan&posted=all
Желательно конечно так же через function.php, но буду рад любому ответу.
И второй вопрос, можно ли сделать переменную, которая будет привязана к одному из параметров этого аякс фильтра. Например, параметр location_location1=abakan - это город Абакан. То есть, переменная должна где-то на странице отображать название города или еще какой-то дополнительный текст. (нужно для SEO)
Дополнительно:
Оставь один вопрос. Второй задавай отдельно. См правила.
Ответы:
Как-нибудь так
add_filter( 'pre_get_document_title', 'wpp_change_the_document_title', 100 ); function wpp_change_the_document_title( $title ) { if ( ! empty( $_GET['location_location1'] ) ) : $title = 'The title for GET location_location1'; endif; return $title; } |
add_filter( 'pre_get_document_title', 'wpp_change_the_document_title', 100 ); function wpp_change_the_document_title( $title ) { if ( ! empty( $_GET['location_location1'] ) ) : $title = 'The title for GET location_location1'; endif; return $title; }
- Спасибо, а подскажите, как сделать эту конструкцию для get_the_archive_title() ? Тоесть заголовок категории или страницы (не поста)
- Не хочет работать этот фильтр, не пойму почему( . Это точно так запрашивать ( ! empty( $_GET['location_location1'] ) ?
Чтобы получить значение гет-запроса вы можете использовать функцию get_query_var(). Например, вы можете использовать эту функцию в фильтре the_title
if ( ! function_exists( 'the_title_callback' ) ) { /** * Function for 'the_title' filter-hook. * * @param string $post_title The post title. * @param int $post_id The post ID. * * @return string */ function the_title_callback( $post_title, $post_id ) { $city = get_query_var( 'location_location1', false ); if ( $city && get_converter_cities( $city ) ) { $post_title = $post_title . ' ' . get_converter_cities( $city ); } return $post_title; } } add_filter( 'the_title', 'the_title_callback', 10, 2 ); if ( ! function_exists( 'get_converter_cities' ) ) { /** * Return string or array with city values. * * @since 1.0.0 * * @param string $control Key to get one value. Optional. Default null. * * @return string|array|false */ function get_converter_cities( $control = null ) { // Sanitize string (just to be safe). if ( ! is_null( $control ) ) { $control = sanitize_title( $control ); } // Main converter array. $converter = array( 'abakan' => __( 'Abakan', 'domain' ), 'moscow' => __( 'Moscow', 'domain' ), 'saratov' => __( 'Saratov', 'domain' ), ); $converter = apply_filters( 'get_converter_cities', $converter ); // Return controls. if ( is_null( $control ) ) { return $converter; } elseif ( ! isset( $converter[ $control ] ) || empty( $converter[ $control ] ) ) { return false; } else { return $converter[ $control ]; } } } |
if ( ! function_exists( 'the_title_callback' ) ) { /** * Function for 'the_title' filter-hook. * * @param string $post_title The post title. * @param int $post_id The post ID. * * @return string */ function the_title_callback( $post_title, $post_id ) { $city = get_query_var( 'location_location1', false ); if ( $city && get_converter_cities( $city ) ) { $post_title = $post_title . ' ' . get_converter_cities( $city ); } return $post_title; } } add_filter( 'the_title', 'the_title_callback', 10, 2 ); if ( ! function_exists( 'get_converter_cities' ) ) { /** * Return string or array with city values. * * @since 1.0.0 * * @param string $control Key to get one value. Optional. Default null. * * @return string|array|false */ function get_converter_cities( $control = null ) { // Sanitize string (just to be safe). if ( ! is_null( $control ) ) { $control = sanitize_title( $control ); } // Main converter array. $converter = array( 'abakan' => __( 'Abakan', 'domain' ), 'moscow' => __( 'Moscow', 'domain' ), 'saratov' => __( 'Saratov', 'domain' ), ); $converter = apply_filters( 'get_converter_cities', $converter ); // Return controls. if ( is_null( $control ) ) { return $converter; } elseif ( ! isset( $converter[ $control ] ) || empty( $converter[ $control ] ) ) { return false; } else { return $converter[ $control ]; } } }
- Здравствуйте, спасибо за ответ. А подскажите теперь, как правильно сделать конструкцию для заголовка категории ( get_the_archive_title() ) или заголовок страницы ( wp_get_document_title() ) (не поста). Тоесть я пробую так, но не получается
function the_title_callback( $title, $post_id ) {
$city = get_query_var( 'location_location1', false );
if ( $city && get_converter_cities( $city ) ) {
$title = get_the_archive_title() . ' ' . get_converter_cities( $city );
}return $title;
}
} - Axel030392, у вас все смешалось — вы пытаетесь сделать новую функцию, в которую передаете параметры, которые не используете, к тому же для вывода нужно делать echo, а не return. Ищите в документации фильтр get_the_archive_title и смотрите как его использовать
- Артем Золин, Так я просто взял кусок вашего кода, верхную часть
- Хотя как бы я не пытался, это и на обычных статьях ваша конструкция тоже не работает((
- Axel030392, у меня написан фильтр для the_title, а вам нужен get_the_archive_title, он работает по такому же принципу
- Артем Золин, тоесть поменять тут:
add_filter( 'the_title', 'the_title_callback', 10, 2 ); на add_filter( 'get_the_archive_title', 'the_title_callback', 10, 2 ); ?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Заголовок на конкретной странице WordPress можно менять через фильтры, а не через правку шаблона. Если речь про HTML
<title>, используйтеpre_get_document_titleили фильтры SEO-плагина. Если нужно изменить видимый H1, это уже зависит от темы и места вывода заголовка.Пример для title страницы по URL или параметру:
add_filter('pre_get_document_title', function ($title) { if (!is_page('contacts')) { return $title; } $city = isset($_GET['city']) ? sanitize_text_field(wp_unslash($_GET['city'])) : ''; if ($city) { return 'Контакты в городе ' . $city; } return $title; });
Для Yoast SEO дополнительно можно изменить SEO-title:
add_filter('wpseo_title', function ($title) { if (is_page('contacts') && !empty($_GET['city'])) { return 'Контакты в городе ' . sanitize_text_field(wp_unslash($_GET['city'])); } return $title; });
Если Вы хотите, чтобы такие страницы индексировались, URL с параметрами — не лучший вариант. Лучше делать нормальные ЧПУ-страницы или rewrite endpoint, иначе получите дубли, странные canonical и проблемы с SEO.
Для изменения H1 ищите в теме функцию вывода заголовка. Иногда достаточно фильтра
the_title, но его нужно ограничить главным циклом, чтобы не поменять заголовки в меню, хлебных крошках и списках записей.Пример ограничения для видимого заголовка:
add_filter('the_title', function ($title, $post_id) { if (!is_page('contacts') || !in_the_loop() || !is_main_query()) { return $title; } if (!empty($_GET['city'])) { return 'Контакты в городе ' . sanitize_text_field(wp_unslash($_GET['city'])); } return $title; }, 10, 2);
Но если это SEO-страницы под города, лучше создать реальные страницы или CPT с нормальными slug. Заголовки через GET-параметры удобны технически, но плохо контролируются в индексации и легко создают тысячи дублей.