Поддержка Проблемы и решения Переадресация на канонические урлы

  • Добрый день!
    Есть пользовательский тип записей hotels и пользовательская таксономия geo (иерархическая).
    URL записи сформирован так: http://domain.com/hotels/%geo%/%post_id%/%post_name% или конкретно, то так
    http://domain.com/hotels/europe/spain/mallorca/225/hotel-paradise
    В коде страницы прописан rel=canonical.

    Проблема в следующем: если изменить post_name, то система автоматически редиректит на верный url (отдает 301) через стандартные средства. Но если изменить geo, редиректа не происходит. Там в geo вообще можно любую лажу вписать и открывает эту страницу. В общем, хочется, чтобы редирект был в обоих случаях. Может я какой-то параметр для таксономии или типа записи не указал? Понимаю, что есть rel=canonical, но всё равно хочется, чтобы редиректил.

    • Тема изменена 2 недели, 6 дней назад пользователем alejanderos.
Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Понимаю, что есть rel=canonical

    Этого вполне достаточно.

    но всё равно хочется, чтобы редиректил

    Попробуйте так:

    
    function wp12456_redirect_to_permalink( $redirect_url, $requested_url ) {
    	if ( is_singular() ) {
    		$post_url = get_permalink( get_queried_object_id() );
    		// If the full post URL is not within the requested URL, let's redirect there.
    		if ( false === strpos( $requested_url, $post_url ) ) {
    			$redirect_url = $post_url;
    		}
    	}
    
    	return $redirect_url;
    }
    add_filter( 'redirect_canonical', 'wp12456_redirect_to_permalink', 10, 2 );
    

    Спасибо большое за ответ! Жаль, что нельзя без дополнительных проверок, на уровне движка такое сделать. Непонятно, почему он post_name фиксит, а таксономию нет.

    Подобную функцию проверки (только с wp_redirect) я и сам написал, но ваша, конечно лучше.

    Спасибо еще раз.

    Модератор Юрий

    (@yube)

    Непонятно, почему он post_name фиксит, а таксономию нет.

    Фича такая. Термов (рубрик, категорий) у записи может быть более одного, и редирект на что-то одно может нарушить логику навигации.

    Фича такая. Термов (рубрик, категорий) у записи может быть более одного, и редирект на что-то одно может нарушить логику навигации.

    Спасибо. Я понял, действительно, в моём конкретном случае так быть не должно, но в принципе, в других проектах, возможно. От дублей спасает каноникал.

    Кстати, код из первого сообщения не срабатывает, сделал вот такой:

    add_action( 'template_redirect', 'local_redirect_canonical');
    function local_redirect_canonical() {
        if( is_single() ){
            $canonical_link = get_permalink();
            $current_link = home_url().$_SERVER['REQUEST_URI'];
                    
            if ($current_link <> $canonical_link) {
                wp_redirect( $canonical_link, 301 );
                exit;
            }
        }
    }
    
    • Ответ изменён 2 недели, 3 дня назад пользователем alejanderos.
Просмотр 4 ответов — с 1 по 4 (всего 4)