programing

WooCommerce - URL에서 제품 및 제품 카테고리를 삭제하는 방법

javajsp 2023. 2. 23. 22:02

WooCommerce - URL에서 제품 및 제품 카테고리를 삭제하는 방법

WordPress에서 WooCommerce를 사용하고 있습니다.WordPress에 제품 및 제품 카테고리가 추가됩니다.

URL.

http://dev.unwaveringmedia.com/8dim/product-category/all-party-supplies/ http://dev.unwaveringmedia.com/8dim/product/14-snowman-serving-tray/

URL에서 'product'와 'product-category'를 삭제해야 합니다.퍼멀링크를 수정하여 제거할 수 있는 방법이 있습니까?

네. 하지만 이 기사를 먼저 읽어보세요.https://docs.woocommerce.com/document/removing-product-product-category-or-shop-from-the-urls/

다음 방법으로 변경할 수 있습니다.

  1. [ Settings ]> [ permalink ]> [ optional ]> [ Product category base = . / ](제품 카테고리 베이스에 ./ 라고 입력합니다)에서 permalinks 를 변경할 수 있습니다.

  2. 카테고리 페이지와 같은 이름(슬래그)의 페이지, 투고, 또는 첨부 파일이 없는 것을 확인해 주세요.그렇지 않으면, 페이지, 투고, 첨부 파일이 충돌해, 코드가 동작하지 않게 됩니다.

  3. 이하의 플러그 인을 인스톨 해 액티브하게 합니다(자세한 것에 대하여는, https://timersys.com/remove-product-category-slug-woocommerce/) 를 참조해 주세요).

`

<?php
/*
Plugin Name: Remove product-category slug
Plugin URI: https://timersys.com/
Description: Check if url slug matches a woocommerce product category and use it instead
Version: 0.1
Author: Timersys
License: GPLv2 or later
*/
add_filter('request', function( $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;
});`

여기에 이미지 설명 입력

상세한 것에 대하여는, https://timersys.com/remove-product-category-slug-woocommerce/ 를 참조해 주세요.

아무도 /product/를 삭제하는 방법에 대해 언급하지 않았습니다.다음은 예를 제시하겠습니다.

function na_remove_slug( $post_link, $post, $leavename ) {
    if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }
    $post_link = str_replace( '/product/', '/', $post_link );
    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

function change_slug_struct( $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' ) );
    } elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) {
        $query->set( 'post_type', array( 'post', 'product', 'page' ) );

        // We also need to set the name query var since redirect_guess_404_permalink() relies on it.
        $query->set( 'name', $query->query['pagename'] );
    }
}
add_action( 'pre_get_posts', 'change_slug_struct', 99 );

일부 테마/플러그인이 이 규칙과 충돌할 수 있기 때문에 우선 순위를 추가했습니다.

페이지네이션과는 통하지 않았다.여기 동작하는 풀코드가 있습니다.

add_filter('request', function( $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;
});

이렇게 하면 쿼리에 페이지 매겨지는 새 개서 규칙이 추가됩니다.

add_action('init', 'do_rewrite');
function do_rewrite(){
add_rewrite_rule( '[^/]+/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&paged=$matches[2]', 'top' );
add_filter( 'query_vars', function( $vars ){
    $vars[] = 'attachment';
    $vars[] = 'paged';
    return $vars;
} );}

셰로즈 알타프의 속임수를 사용하면 그 일을 완벽하게 해낼 수 있다.

사이에 다음 추가$slug그리고.$exists선언을 통해 하위 범주에서도 사용할 수 있습니다.

$slug_array = explode( '/', $slug );
$slug = array_values(array_slice($slug_array, -1))[0];

다음 필터를 사용할 수 있습니다.woocommerce_register_post_type_product

다음은 /product/만 제거하고 카테고리는 유지하려는 예입니다.

add_filter( 'woocommerce_register_post_type_product', function($var) {
    $var['rewrite'] = str_replace('/product/', '/', $var['rewrite']);
    return $var;
});

그런 다음 Admin 패널에서 permalinks를 업데이트하여 permalinks를 플러시하십시오.

관리 패널 Permalinks의 permalink 구조에는 '/product/'가 계속 표시되지만 영향을 미치지는 않습니다.

다른 솔루션은 모두 실패했고, 시행착오를 거듭한 끝에 이 솔루션을 생각해 냈습니다.

  1. https://masterns-studio.com/code-factory/wordpress-plugin/woo-category-base/에서 무료 'WO CATGERY BASE PERMALINK FIXER' 플러그인을 설치합니다.
  2. Product Category Base Permalinks를 shop으로 설정합니다.
  3. 커스텀 베이스 퍼멀링크를 /shop/%product_cat%/로 설정합니다.

그러면 URL은 다음과 같이 표시됩니다.

http://www.example.com/shop/category/sub-category/product

페이지 번호부여 및 하위 카테고리에 대해서는 정상적으로 동작하고 있는 것 같습니다.

언급URL : https://stackoverflow.com/questions/43447175/woocommerce-how-to-remove-product-product-category-from-urls