web-dev-qa-db-ja.com

カスタムフィールドによるカスタム投稿タイプのクエリ

一般的な情報

私はプラグインWP Types(wp-types.com)を使って "artist"というカスタム投稿タイプを作成しました。
WP Typesでは、他の投稿タイプを親投稿タイプとして設定することもできます。これはデフォルトでは不可能です。彼らはこの機能をキー付きのメタクエリで実装しました。
"_ wpcf_belongs_%POSTTYPE%_id"(私の場合は "_wpcf_belongs_artist_id")
そして値は親投稿のIDです。

問題

通常、ページXをページYの子として設定すると、次のようなパーマリンク構造になります。
/page-y/page-x /

私はこのプラグインがこれを採用すると思いましたが、採用しませんでした。たとえば、親ページとしてID 24を持つ "painting"と、子としてID 72を持つ "picasso"を使用します。投稿タイプ "artist"で投稿する。したがって、この:
/painting/picasso /
は私を以下にリダイレクトします。
/artist/picasso /
しかし正しい内容を出力します。

私の解決策

有料のサポートは私を助けることができなかったので私は自分で試みなければなりません。私自身の "カスタム"書き換え規則を書くためには、最初は正しい問い合わせを知っていなければなりません。コンテンツを手動で取得しようとしました。

index.php?_wpcf_belongs_artist_id = 24&artist = picasso
は私を以下にリダイレクトします。
/artist/picasso?_wpcf_belongs_artist_id = 24&artist = picasso
シングルアーティスト投稿の正しい出力です。

この:
index.php?_wpcf_belongs_artist_id = 24
は私のフロントページを出力するだけです。

多かれ少なかれ working の変種は:
/painting/picasso /?artist = picasso&_wpcf_belongs_artist_id = 24そして:
/painting/picasso /?artist = picasso
これらは しない 私を/ artist/picasso /…またはどこにでもリダイレクトしますが、正しいシングルアーティスト投稿を出力しません。

ここ _ WP Typesのサポートフォーラムには、さらにいくつかの亜種とスレッド全体があります。

最初のステップは、おそらく "parent_id"のようなqueryvarを使って正しい内容を取得することでしょう。その後、書き換えルール自体の扱いを始めることができますが、トップレベル(%pagename%と%parent_id%)の二重の使用のために問題があるかもしれません。これはおそらくWordPressを混乱させるでしょう。

アップデート12/17

このコードを試して、メタフィールド '_wpcf_belongs_artist_id'とURLから取得したメタ値(/?parent_id = 24)を持つすべての投稿を取得しました。残念ながら、うまくいかないようです。それは私のサブメニューの補助クエリをクラッシュさせ、通常のクエリの結果だけを出力します。

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

function parent_query( $query ) {
    // Exclude
    if( $query->is_admin == 1 && !$query->is_main_query() && !$query->is_archive == 1 ) {
        return;
    }
    // retrieve field name / value from URL if exist
    $custom_field = '_wpcf_belongs_artist_id';
    $custom_value = ( $_GET['parent_id'] ) ? stripslashes( $_GET['parent_id'] ) : '';
    if( $custom_field ) {
        // add meta key requirement -- we’ll return all posts with some ‘color’
        $query->set( 'meta_key', '_wpcf_belongs_artist_id' );
        if( $custom_value ) {
            // build meta value requirement -- we’ll return only blue
            $query->set( 'meta_value', $custom_value );
        }
    }
}
add_action( 'pre_get_posts', 'parent_query' );
5
luke

あなたはそれをかなり近づけました。これはあなたがやろうとしていることの実例です。

class Wpse_126374 {

    public function __construct() {
        add_action( 'init', array( $this, 'rewrites' ) );
        add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
    }

    public function rewrites() {
        add_rewrite_tag( '%parent_id%', '(\d+)' );
    }

    public function pre_get_posts( $query ) {
        // Don't run this on admin pages or secondary queries
        if ( is_admin() || ! $query->is_main_query() || $query->is_archive() )
            return;

        if ( '' != ( $parent_id = get_query_var( 'parent_id' ) ) ) {
            $query->set( 'meta_key', '_wpcf_belongs_artist_id' );
            $query->set( 'meta_value', $parent_id );
        }
    }

}
$wpse_126374 = new Wpse_126374;

これにより、URLにparent_id=24を含めることができます。

2
Matthew Boynes

私はその問題は不適切だと思います。ピカソの作品を2枚追加するとすぐにどうなりますか?/painting1/picassoと/ painting2/picassoの両方が同じ「単一のアーティストの投稿」を指すようにしますか。私はこれが可能であると思いますが、それが不必要に複雑であると確信しています(そしてSEO問題を引き起こすかもしれません)。

一方、アーティストと絵画は異なる種類のエンティティであるため、Picassoが/ artist/picassoの下に表示されていること、およびこの投稿が彼が書いたすべての絵画からリンクされていることはまったく問題ありません。

親の関係を使うのは間違っています。絵は(通常)一人の作者しかいませんが、芸術家は多くの絵を生み出すことができます。しかし、1つの投稿は1つの親しか持つことができないので、アーティストの投稿をその絵の1つの子にするべきではありません。そうしないと、同じ作者による別の絵を追加した直後に問題になります。

代わりに、あなたは芸術家を絵画の財産にするべきです。これを行うには、絵画用のカスタムフィールドを追加し、Typesの投稿の関係またはその他のデバイスを使用して、このカスタムフィールドの値がアーティストの投稿タイプを参照するように強制します。

このアプローチでは、あなたの問題は「解決」されず、ただ消えます。

0
adelval

pre_get_postsを使用するとき、関数から何かを返す必要はありません。

function 
if( $query->is_admin() || !$query->is_main_query() || $query->is_archive() ) {
//Do your stuff
0
Manolo