• Не могу найти решение банальной вещи — объединение базы урлов товаров и категорий 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( '/' . $post->post_type . '/', '/', $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/

    Чтобы не было 404 ошибки, можно добавить еще такой код в functions.php

    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 ошибку не выдают, но не выводят товары (вместо них надпись «Товаров, соответствующих вашему запросу, не обнаружено.»).
    Напомню. что на страницах пагинации в подкатегориях все товары нормально отображаются.

    Прошу помощи в решении этой проблемы, чтобы закрыть данный вопрос раз и навсегда.
    (если у вас получается привести товары и категории к общей базе, но без /shop/ то тоже хотелось бы увидеть данное решение.)

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

  • Тема «404 ошибка в пагинации категории woocommerce при общей базе урлов /shop/» закрыта для новых ответов.