web-dev-qa-db-ja.com

カスタム変数でURLを適切に書き換える方法

私はショップのuriを書き直そうとしましたが、今持っているのはこのコードです:

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('wp_loaded','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules) {
    $newrules = array();
    $newrules['shop/brand/(brand)/?$'] = 'shop.php?brand=$matches[1]' ; 
     //$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
     return $newrules + $rules ;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars) {
    array_Push($vars, 'brand');
    return $vars;
}

しかし、私が何をしても、これを機能させることはできません。 Monkeyman Rewrite Analyzerプラグインを使用して、アクティブなapリライトを表示していますが、それは、ブランドが「公開されておらず、保存されない」ということです。また、shop.phpをshop_phpに変更します...

shop/brand/(brand)/?$    shop_php?brand: (brand)

なぜこんなに混乱するのですか? .htaccessを可能な限り変更しようとしました。また、これをテーマにしたいので。

1
Adeerlike

そのため、最初に、ページを読み込むたびに書き換えルールをフラッシュしないでください。一度プラグインのアクティベーションで行う方が良いです。

ステップ1:書き換えルールを追加します。

add_action( 'init', 'wpse26555_add_rewrite' );
function wpse26555_add_rewrite()
{
    // You should probably rewrite to index.php instead of shop.php?
    add_rewrite_rule( '/shop/brand/([^/]+)/?$', 'index.php?brand=$matches[1]', 'top' );
}

ステップ2:クエリ変数を追加する

add_filter( 'query_vars', 'wpse26555_add_vars' );
function wpse26555_add_vars( $vars )
{
    $vars[] = 'brand';
    return $vars;
}

次に、プラグインのアクティブ化でフラッシュします(このようなものはおそらくプラグインファイルにあるはずなので)。

<?php    
// Somewhere in your plugin's main file    
register_activation_hook( __FILE__, 'wpse26555_activation' );
function wpse26555_activation()
{
        // Add the rule first
        wpse26555_add_rewrite();
        // Then flush rewrite rules
        flush_rewrite_rules();
}

次に、フロントエンドで次のようなことができます:

if( $brand = get_query_var( 'brand' ) )
{
    // Do stuff with $brand here

}

たぶん、より良い戦略は、特定のページにブランドを書き直すことでしょうか?それとも、ブランドは何らかのカスタム分類法である可能性がありますか?

上記のコードをテストする必要があります、それは私の頭の外でしたが、それは動作するか、少なくとも開始する必要があります

6
chrisguitarguy

トップの答えは機能しますが、これらのタイプの書き換えを行うより適切で公式な方法があります...

たとえば、次のコードはカスタムクエリ変数を登録し、同じアクションから書き換えルールを登録します。

function include_cpt_rewrites(){
  add_rewrite_tag('%brand%', '([a-zA-Z0-9-]+)');

  add_rewrite_rule('^shop/brand/([^/]+)/?$', 'index.php?brand=$matches[1]', 'top');
}
add_action('init', 'include_cpt_rewrites');

パーマリンクをフラッシュする最終ステップは、settings/permalinksに移動してsave changesを押すことにより、コードで実行する代わりに、WP adminから手動で実行できます。

add_rewrite_tags / add_rewrite_rules

0
eballeste

長い返信をありがとう。問題は、ここでプラグインを作成するのではなく、単にプラグインと対話しようとしていることです。そのショッププラグイン[theCartPress]を使用し、その周りに独自のデザインを作成し、その種類のカスタム投稿タイプ[tcp_product]のshop.phpページを作成しました。

その投稿タイプのすべての投稿を正しいファイルに転送しますが、ブランド別に表示できるようにしたいのです。私は?brand = mybrandを実行できるように_GETをいくつか持っていますが、wordpressパーマリンクを使用したいです。私は実際にカスタム分類を持っています。それは私のGET後に使用するものです:

 if (($_GET['brand'] == 'owl') || !isset($_GET['brand'])) {
    $brand = 'owl';
  } else {
    $brand = $_GET['brand'];
  }
  $args = array( 'post_type' => 'tcp_product', 'posts_per_page' => 30, 'tax_query' => array(
    array('taxonomy' => 'tcp_product_supplier', 'field' => 'slug', 'terms' => $brand)));

$loop = new WP_Query( $args );

回答の投稿を使用したmodには申し訳ありませんが、コメントの再フォーマットは不可能です。

0
Adeerlike