Как исправить ошибку 404 в пагинации в категориях WooCommerce с общим базовым URL /shop/?

Вопрос или проблема

Я не могу найти решение — унификация базовых URL для продуктов и категорий в WooCommerce.

Я нашел только одно рабочее решение:

В Настройках -> Постоянные ссылки:
Измените базу категории на shop
Измените пользовательскую структуру на /shop/%product_cat%/

И добавьте в файл functions.php следующий код:

add_filter( 'request', 'change_requerst_vars_for_product_cat' );
add_filter( 'term_link', 'term_link_filter', 10, 3 );
add_filter( 'post_type_link', 'wpp_remove_slug', 10, 3 );
add_action( 'pre_get_posts', 'wpp_change_request' );

function change_requerst_vars_for_product_cat($vars) {

    global $wpdb;
    if ( ! empty( $vars[ 'pagename' ] ) || ! empty( $vars[ 'category_name' ] ) || ! empty( $vars[ 'name' ] ) || ! empty( $vars[ 'attachment' ] ) ) {
      $slug   = ! empty( $vars[ 'pagename' ] ) ? $vars[ 'pagename' ] : ( ! empty( $vars[ 'name' ] ) ? $vars[ 'name' ] : ( ! empty( $vars[ 'category_name' ] ) ? $vars[ 'category_name' ] : $vars[ 'attachment' ] ) );
      $exists = $wpdb->get_var( $wpdb->prepare( "SELECT t.term_id FROM $wpdb->terms t LEFT JOIN $wpdb->term_taxonomy tt ON tt.term_id = t.term_id WHERE tt.taxonomy = 'product_cat' AND t.slug = %s", array( $slug ) ) );
      if ( $exists ) {
        $old_vars = $vars;
        $vars     = array( 'product_cat' => $slug );
        if ( ! empty( $old_vars[ 'paged' ] ) || ! empty( $old_vars[ 'page' ] ) ) {
          $vars[ 'paged' ] = ! empty( $old_vars[ 'paged' ] ) ? $old_vars[ 'paged' ] : $old_vars[ 'page' ];
        }
        if ( ! empty( $old_vars[ 'orderby' ] ) ) {
          $vars[ 'orderby' ] = $old_vars[ 'orderby' ];
        }
        if ( ! empty( $old_vars[ 'order' ] ) ) {
          $vars[ 'order' ] = $old_vars[ 'order' ];
        }
      }
    }

    return $vars;

  }

function term_link_filter( $url, $term, $taxonomy ) {

    $url = str_replace( "/product-category/", "/shop/", $url );
    return $url;

  }

function wpp_remove_slug( $post_link, $post, $name ) {

    if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
      return $post_link;
    }
    $post_link = str_replace( "https://wordpress.stackexchange.com/" . $post->post_type . "https://wordpress.stackexchange.com/", "https://wordpress.stackexchange.com/", $post_link );

    return $post_link;

  }

function wpp_change_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[ 'page' ] ) ) {
      return;
    }
    if ( ! empty( $query->query[ 'name' ] ) ) {
      $query->set( 'post_type', array( 'post', 'product', 'page' ) );
    }

}

После этого все работает хорошо, но пагинация не работает.

Она работает только на страницах подкатегорий https://dverinevada.ru/shop/vhodnye-dveri/kondor/page/2/
Но на страницах категорий возникает ошибка 404 https://dverinevada.ru/shop/vhodnye-dveri/page/2/

Мы можем добавить такой код в functions.php, чтобы исправить ошибку 404:

function codernote_request($query_string ) {
if ( isset( $query_string['page'] ) ) {
if ( ''!=$query_string['page'] ) {
if ( isset( $query_string['name'] ) ) {
unset( $query_string['name'] ); }
}
}
return $query_string;
}
add_filter('request', 'codernote_request');

После этого страницы пагинации не имеют ошибки 404, но продуктов нет (вместо них сообщение «Не найдено ни одного продукта, соответствующего вашему запросу.»).

Я прошу помощи в решении этой проблемы.

У меня была такая же проблема, но на кастомной странице archive-product.php, которая содержит пользовательский запрос для получения моих продуктов с только 10 результатами на странице.

У меня были страницы с ошибкой 404 на странице магазина и страницах категорий со второй страницей пагинации.

После анализа я обнаружил, что основной запрос WooCommerce запрашивает 16 результатов, но в моей базе данных было только 12 продуктов. Таким образом, основной запрос ничего не возвращает.

Чтобы изменить это, мне нужно сделать в админке: Внешний вид > Настроить > WooCommerce > Каталог товаров и изменить значение на 1 для продуктов в строке и строк на странице.

С этим основной запрос всегда возвращает 1 результат и у меня больше нет страниц с ошибкой 404.

Надеюсь, это поможет вам или кому-то другому.

Источник: https://docs.woocommerce.com/document/change-number-of-products-displayed-per-page/

Ответ или решение

Решение проблемы с ошибкой 404 в пагинации категорий WooCommerce с общим URL-основанием /shop/

Если вы сталкиваетесь с ошибкой 404 на страницах пагинации в категориях WooCommerce, это может быть следствием конфликта между настройками постоянных ссылок и запросами к базе данных. Рассмотрим несколько шагов для устранения этой проблемы.

1. Настройка постоянных ссылок

Первым шагом будет корректная настройка постоянных ссылок в админке WordPress:

  • Перейдите в НастройкиПостоянные ссылки.
  • Установите База категории на shop.
  • Измените Пользовательская структура на /shop/%product_cat%/.

Эти настройки помогут унифицировать URL для продуктов и категорий, однако они сами по себе могут не решить проблему с пагинацией.

2. Корректировка файла functions.php

Чтобы исправить ошибку 404 на страницах категорий, вам нужно будет добавить несколько фильтров и функций в файл functions.php вашей темы. Этот код поможет изменить запросы и ссылки для категорий:

add_filter( 'request', 'change_request_vars_for_product_cat' );
add_filter( 'term_link', 'term_link_filter', 10, 3 );
add_filter( 'post_type_link', 'wpp_remove_slug', 10, 3 );
add_action( 'pre_get_posts', 'wpp_change_request' );

function change_request_vars_for_product_cat($vars) {
    global $wpdb;
    if ( ! empty( $vars[ 'pagename' ] ) || ! empty( $vars[ 'category_name' ] ) || ! empty( $vars[ 'name' ] ) || ! empty( $vars[ 'attachment' ] ) ) {
        $slug = ! empty( $vars[ 'pagename' ] ) ? $vars[ 'pagename' ] : ( ! empty( $vars[ 'name' ] ) ? $vars[ 'name' ] : ( ! empty( $vars[ 'category_name' ] ) ? $vars[ 'category_name' ] : $vars[ 'attachment' ] ) );
        $exists = $wpdb->get_var($wpdb->prepare("SELECT t.term_id FROM $wpdb->terms t LEFT JOIN $wpdb->term_taxonomy tt ON tt.term_id = t.term_id WHERE tt.taxonomy = 'product_cat' AND t.slug = %s", array($slug)));
        if ($exists) {
            $old_vars = $vars;
            $vars = array('product_cat' => $slug);
            if (!empty($old_vars['paged']) || !empty($old_vars['page'])) {
                $vars['paged'] = !empty($old_vars['paged']) ? $old_vars['paged'] : $old_vars['page'];
            }
            if (!empty($old_vars['orderby'])) {
                $vars['orderby'] = $old_vars['orderby'];
            }
            if (!empty($old_vars['order'])) {
                $vars['order'] = $old_vars['order'];
            }
        }
    }
    return $vars;
}

function term_link_filter($url, $term, $taxonomy) {
    return str_replace("/product-category/", "/shop/", $url);
}

function wpp_remove_slug($post_link, $post, $name) {
    if ('product' !== $post->post_type || 'publish' !== $post->post_status) {
        return $post_link;
    }
    return str_replace("https://example.com/" . $post->post_type . "/", "https://example.com/", $post_link);
}

function wpp_change_request($query) {
    if (!$query->is_main_query() || 2 !== count($query->query) || !isset($query->query['page'])) {
        return;
    }
    if (!empty($query->query['name'])) {
        $query->set('post_type', array('post', 'product', 'page'));
    }
}

3. Обработка ошибок в пагинации

После введения указанных изменений, вы можете столкнуться с ситуацией, когда при переходе на страницы пагинации вы видите сообщение «Нет продуктов, соответствующих вашему запросу». Это может быть из-за того, что количество доступных продуктов в категории меньше, чем запрашиваемое количество.

Существует простой способ устранить это:

  • Перейдите в Внешний видНастроитьWooCommerceКаталог продуктов.
  • Убедитесь, что параметр Продуктов на странице настроен так, чтобы соответствовать количеству продуктов, которые у вас есть.

4. Дополнительные улучшения и рекомендации

Если после выполнения вышеописанных шагов проблема с ошибками 404 в пагинации все еще актуальна, вы можете использовать следующий код для дополнительно настройки вашего сайта:

function codernote_request($query_string) {
    if (isset($query_string['page']) && '' != $query_string['page']) {
        unset($query_string['name']);
    }
    return $query_string;
}
add_filter('request', 'codernote_request');

Это изменит обработку запросов и может помочь избежать ошибок 404 на страницах пагинации.

Заключение

Следуя этому алгоритму, вы сможете устранить ошибки 404 на страницах пагинации в категориях WooCommerce с общим URL-основанием /shop/. Настройка постоянных ссылок, корректировка функций в functions.php, а также правильная конфигурация продуктов на странице — все это поможет вам улучшить работу вашего интернет-магазина.

Оцените материал
Добавить комментарий

Капча загружается...