如何修复常见url库/shop/的WooCommerce类别中的404分页错误?

时间:2019-03-08 作者:Vladislav Mamontov

我找不到一个解决方案——统一woocommerce中产品和类别的url库。

我只找到了一个可行的解决方案:

在设置->永久链接:类别基础更改shop自定义结构更改打开/shop/%product_cat%/

并添加到函数。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/

我们可以在函数中添加这样的代码。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错误,但没有产品(而是消息“找不到与您的请求匹配的产品”)。

我请求帮助解决这个问题。

1 个回复
SO网友:A.Choquet

我也有同样的问题,但在一个定制的归档产品上。php页面,其中包含一个自定义查询,以获取每页只有10个结果的产品。

我在商店页面和分类页面上有404页,第二页是分页。

经过分析,我发现WooCommerce的主查询需要16个结果,但我的数据库中只有12个产品。因此,主查询不返回任何内容。

要改变这一点,我需要在管理中执行:外观>自定义>WooCommerce>产品目录,并将每行产品和每页行的值更改为1。

这样,主查询总是返回1个结果,我就没有404页了。

我希望这会对你或其他人有所帮助。

资料来源:https://docs.woocommerce.com/document/change-number-of-products-displayed-per-page/

相关推荐

Dropdown menu for categories

当我使用下面的代码时<?php wp_nav_menu( array(\'menu\' => \'categories\' )); ?> 我可以创建一个新的菜单来列出我创建的wordpress中的所有类别。我用它在页面中间列出所有类别。我现在的问题是:有没有一种简单的方法可以为存在的每个子类别创建下拉菜单?那么,当我点击一个特定的类别时,它的子类别会显示出来吗?