web-dev-qa-db-ja.com

検索パラメーターを使用して分類アーカイブページを変更する方法

トピックという分類法があります。

ユーザーがこのアーカイブページをexample.com/topics/wordpress/のように配置した場合、私はタイトルまたは説明にwordpressname__という単語を含むすべての投稿を書き出す必要があります。

そのために次のコードを追加しました。

function pp_change_page_layout( $query ) {


    if ( $query->is_main_query()) {        
        if ( is_tax('topics') ){
            $query->set('s' , 'WordPress'); // I hard code the search turm just for the testing purposes. I will take the archive slug.
        }
    }
}
add_action( 'pre_get_posts', 'pp_change_page_layout' );

しかし、これは私が望むようには動作しません。このコードが行うことは、最初に トピック分類学のすべての投稿 を取り、次にフィルターをかけることです。

このコードを以下のように修正したい。

ユーザーがexample.com/topics/wordpress/を着陸したとき、I すべての投稿を取得する必要があります (その分類法だけではありません)私のブログにアクセスし、WordPressWordでフィルタリングします。上記のコードを修正するにはどうすればいいですか?

2
Ranuka

以下の解決策は、投稿のタイトル、抜粋、またはコンテンツに用語名を使用する、クエリされた用語名 または postsに関連付けられた投稿を返します。

スラグという用語ではなく、人間が読める用語名を検索に使用していることに注意してください。ハイフンを付けることができるため、検索には理想的ではありません。

まず、検索クエリに分類用語の名前を追加し、検索SQLを変更するためにフィルタを接続します。

/**
 * Adds taxonomy term name to search query and wires up posts_search
 * filter to change the search SQL.
 * 
 * @param WP_Query $query The WP_Query instance (passed by reference).
 */
add_action( 'pre_get_posts', 'wpse_add_term_search_to_term_archive' );
function wpse_add_term_search_to_term_archive( $query ) {

    // Bail if this is the admin area or not the main query.
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    // Set the taxonomy associated with our term. Customize as needed.
    $taxonomy_slug = 'genre';

    // Get the term being used.
    $term_slug = get_query_var( $taxonomy_slug );

    if ( is_tax( $taxonomy_slug ) && $term_slug ) {
        // We have the term slug, but we need the human readable name. This
        // will be available in the term object.
        $term_object = get_term_by( 'slug', $term_slug, $taxonomy_slug );

        // Bail if we can't get the term object.
        if ( ! $term_object ) {
            return;
        }

        // Sets this query as a search and uses the current term for our search.
        $query->set( 's' , $term_object->name );

        // Wire up a filter that will alter the search SQL so that the term archive
        // will include search results matching the term name *OR* posts assigned to
        // the term being queried.
        add_filter( 'posts_search', 'wpse_tax_term_posts_search', 10, 2 );
    }
}

次に、taxクエリ または searchクエリが返されるように検索SQLを変更します。

/**
 * Change the search SQL so that results in the tax query OR
 * the search query will be returned.
 *
 * @param string   $search Search SQL for WHERE clause.
 * @param WP_Query $wp_query   The current WP_Query object.
 */
function wpse_tax_term_posts_search( $search, $wp_query ) {
    // Replaces the first occurrence of " AND" with " OR" so that results in the 
    // tax query OR the search query will be returned.
    return preg_replace( '/^\s(AND)/', ' OR', $search );
}
2
Dave Romsey