Как изменить заголовок на конкретной странице в WordPress?

Ссылка скопирована
1 ответ

Как можно изменить заголовок на конкретной странице, в адресе которой есть аякс параметры? То есть, вопрос не в том как поменять скажем на отдельной записи или страницы, у которых есть айдишники, а вот в таком формате:

.../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)

Дополнительно:

Оставь один вопрос. Второй задавай отдельно. См правила.

  • Refguser, Ну так они связанны. Если нельзя менять заголок то хотябы создать переменную для этого заголовка.
  • Ответы:

    Как-нибудь так

    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'] ) ?

    Как изменить заголовок на конкретной странице в WordPress?

    Чтобы получить значение гет-запроса вы можете использовать функцию 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 ); ?
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция DevOps Ответ

    Заголовок на конкретной странице 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;
    });

    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') &amp;&amp; !empty($_GET['city'])) {
            return 'Контакты в городе ' . sanitize_text_field(wp_unslash($_GET['city']));
        }
     
        return $title;
    });

    add_filter('wpseo_title', function ($title) { if (is_page('contacts') &amp;&amp; !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);

    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-параметры удобны технически, но плохо контролируются в индексации и легко создают тысячи дублей.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно