1

私は何週間もウェブを検索して脳をガタガタ鳴らしてきましたが、役に立ちませんでした。

WordPress(v3.4)に製品データベースがあり、URLクエリを使用して検索できるようにしようとしています。

理想的には、これが私が望むシナリオです。

  • ドメイン/製品-すべての製品を表示する
  • domain / products?tax1=term1-分類法で製品をフィルタリングします
  • domain / products?tax1 = term1&tax2=term2-複数の
    分類をフィルタリングします。

post_typeは「product」と呼ばれ、現在、ページテンプレートが割り当てられたproductsというページがあります。ただし、WordPressのURLクエリを使用しようとすると、同様のURLのニュース投稿にリダイレクトされます(例:domain / 2011/10/01 / products-are-cool)。

これらのフィルターを作成して、結果を正しく表示するにはどうすればよいですか?

更新:私は私のために完全に機能する解決策を思いついた。

if(isset($_GET)) $options = $_GET;

if (!empty($options)) {
$posts = new WP_Query( array(
'post_type' => 'product',                       
'orderby' => 'title',                       
'order' => 'asc',                       
'paged' => $paged,                      
'tax1' => $options['tax1'],                 
'tax2' => $options['tax2'],
));

次に、を使用add_query_arg($termslug,$term->slug)して分類をURLに追加します。

4

1 に答える 1

1

競合するURI構造ルールがいくつかあります。htaccessに行を追加して、この特定のページの問題を解決できます。WordPressで生成されたルールの前で、RewriteEngine On句の後に配置します。

RewriteRule    /products /?page=33 [L,QSA]

明らかに33はページIDです。[L]ディレクティブは、これが実行される最後の書き換えであり、新しいURIに直接移動する必要があることを意味します。[QSA]はproducts?had=here、新しいURIにクエリを添付する必要があります?page=33&had=here

との違いを指摘しRedirectますRewrite

  • リダイレクトにより、URIが何らかの理由(一時的/永続的など)でリダイレクトされたという応答が返されます。
    • http-request get /products?tax=tax1=>
    • http-response 301 (moved permanently to:) /?page=33&tax=tax1=>
    • http-request get /?page=33&tax=tax1
  • ブラウザのアドレスバーにリダイレクトが表示されます。
  • リダイレクトは検索クローラーによってインデックス付けされます。

  • リライトは、URIがリライトされたことを示す応答を返信しません。

  • サイトのアドレスバーに書き換えは表示されません。
  • リライトは、アプリケーション側(WordPress)で、アプリケーションがリライトされたURIを受信したかのように動作します(WordPressは、アドレスがリライトされたことを認識していません)。

基本的に私が提案した解決策は、/products?tax=tax1WordPressに書き換えられたアドレスを表示しながら、訪問者/ブラウザにアドレスを表示します/?page=33&tax=tax1

.htaccess 他のWordPressの書き換えが行われる前にこれを行い、[L]を使用して後続の書き換えの実行を停止すると、WordPressのURI分析の内部メカニズムを回避できます。

WordPressの内部メカニズムは、URIが指しているカテゴリ/ページ/投稿を見つけようとします。ただし、URIスキームは最適ではありません(同じ名前のカテゴリとページがある場合、WordPressはそれらの1つを選択しますが、必ずしも正しいものではありません)。

テンプレートコードのfunctions.phpに次の関数を配置する必要があります。またはプラグインで。

function custom_search_query( $request ) {
    $query = new WP_Query();  // the query isn't run if we don't pass any query vars
    $query->parse_query($request);

    $request['post_type'] = 'product';

    // this is the actual manipulation; do whatever you need here
    if(isset($_GET))
        $options = $_GET;
    if (!empty($options)) {
        $i = 0;
        $request['tax_query'] = array(); // resetting any previously selected meta_queries that might "linger" and cause weird behaviour.
        // CAREFUL HERE ^ might not be desired behaviour

        foreach($options AS $key => $value) {
            $request['tax_query'][$i]['taxonomy'] = $key;
            $request['tax_query'][$i]['terms'] = array($value);
            $request['tax_query'][$i]['operator'] = 'IN';
            $i++;
        }
    }

    return($request);
}
add_filter( 'request', 'custom_search_query' );

ユーザー入力の検証は行われません(wordpressがその一部を実行する可能性がありますが、実行する方が良いです)。

于 2012-06-30T14:15:08.093 に答える