web-dev-qa-db-ja.com

複数(2つ以上)の分類法の書き換え規則

私はウーコマースを使用していて、単なる分類法である「製品属性」をいくつか持っています。

以下の分類法があります。

  • pa_color
  • pa_material
  • pa_style

pa_はproduct属性を表し、WooCommerceに組み込まれてこれらの分類法を処理するので、これを変更することはできません。

WooCommerceには、商品カテゴリ(product_cat)と商品タグ(product_tag)の分類法もあります。

次のクエリは、Fabrics製品カテゴリのすべてのRed、Vinyl製品を取得します。

?product_cat =生地&pa_material =ビニール&pa_color =赤

私はこれをかなりのパーマリンクに変えたいと思います。

製品カテゴリ/布地/材質/ビニール/カラー/赤

この答えは私が私が達成しようとしているものにかなり近づかせます:

複数の分類法クエリに対するURL書き換えルール

2つの分類法(product_cat + 1の属性分類法)を処理するためのURLを取得できるという点で、3つ(またはそれ以上)のパラメーターを取得する方法にこだわっています。

だから私は得ることができます:

/商品カテゴリ/生地/色/赤

または

/製品分類/生地/素材/ビニール

3つ全部ではない

/製品分類/生地/素材/ビニール/カラー/赤

edit /私はそれがURLであることが理想的だと思いますが

/生地/ビニール/赤

それが可能かどうかわからない?

編集を終了/

WooCommerceには、パーマリンクを変更するための設定もあり(URLに 'shop'を付ける、製品カテゴリのスラッグを変更するなど)、最終的にはそのことを考慮する必要がありますが、今はこの最初のステップをやめる必要があります。

簡単にするために、これは私のコードの簡略版です。私は実際には組み込みのウ​​ーコマース機能からタクソノミーを取得していますが、問題はウーコマースに限られているわけではありません。

add_action( 'init', 'wpa_init' );
function wpa_init() {

$taxonomies = array ('pa_color'=>'Color','pa_material'=>'Material','pa_style'=>'Style');
$base = 'product-category';

        foreach ($taxonomies as $taxonomy=>$mask):      
            $attribute = strtolower(sanitize_title($mask));
            add_rewrite_rule( $base.'/(.+?)/'.$attribute.'/([^/]+)(/page/(\d+))?/?$', 'index.php?product_cat=$matches[1]&'.$taxonomy.'=$matches[2]&paged=$matches[4]', 'top' );         
        endforeach;     
}

これは私が分類クエリのパーマリンクで見つけた最高のリソースでした: http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ /

しかし、それもまた、2つの分類法で立ち往生しているようです。

4
helgatheviking

あなたはこのようなことを試すことができます:

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'product-category/(.+)/material/(.+)/color/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2).'&pa_color='. $wp_rewrite->preg_index(3)
        'product-category/(.+)/color/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_color='. $wp_rewrite->preg_index(2)
        'product-category/(.+)/material/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2)
    );

    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );

宣伝どおりには機能しないかもしれませんし、正規表現の変更を行う必要があるかもしれませんが、それが一般的な要点です(作業の90%)。

このコードを追加/編集/削除したり、それをfunctions.phpやカスタムプラグインに入れたりする場合は、パーマリンクをフラッシュする必要があります。パーマリンクをフラッシュするには、管理者エリアに入り、パーマリンクを再保存するだけです。

補足として、階層を使い始めると衝突問題に遭遇するかもしれません、

例えばtshirts/smallとdresses/smallのカテゴリがあり、/ products-category/small/color/redのようなURLを使用すると、期待した結果が得られない場合があります。小さなTシャツ?それとも小さなドレスですか?

あいまいさに注意してください

4
Tom J Nowell

将来の参考のために(来年、私がグーグルして再び自分の質問を見つけたときのように)、これは$new_rules配列のキーをadd_rewrite_rule()の$ regexパラメータに、$ rewriteと 'top'としての値に変換することでadd_rewrite_rule()構文に変換できます。 $ポジションとして。

add_rewrite_rule($regex,$rewrite, $position);

または上から私の要求の1つの例として:

function custom_rewrite() {

   add_rewrite_rule(
    'product-category/(.+?)/material/(.+?)/?$',
    'index.php?product_cat=matches[1]&pa_material=$matches[2]',
    'top'
    );

}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( 'init', 'custom_rewrite' );

何らかの理由でフック/フィルタとしてregenerate_rewrite_rulesを使用できなかったのでinitに切り替えました。

3
helgatheviking