web-dev-qa-db-ja.com

クエリエラーの原因となるプラグインを使用する必要があります

このようにループ内の特定のタグからの投稿のみを表示するMUプラグインを作成しました。

function custom_tags( $query ) {
    $query->set( 'tag', array( 'custom', 'general' ) );
}
add_action( 'pre_get_posts', 'custom_tags' );

配列を削除して1つのタグだけをチェックしても問題はありませんが、上記のように複数のタグで動作させるにはどうすればよいですか。

私が得ているエラーは次のとおりです。

Warning: strpos() expects parameter 1 to be string, array given in /srv/users/s/wp-includes/query.php on line 1966

Warning: preg_split() expects parameter 2 to be string, array given in /srv/users/s/wp-includes/query.php on line 1967

更新されたコード

$current = substr($_SERVER[HTTP_Host], 0, -4);

function custom_tags( $query ) {
        $query->set( 'tag', 'general,{$current}' );
}
add_action( 'pre_get_posts', 'custom_tags' );
1
Joe Bobby

Milo(そしてあなたのエラー)が指摘するように:あなたは文字列が期待されるところに配列を渡している。 WP_Queryタグパラメータに従って

特定のタグに関連した投稿を表示します。

  • tag(string) - タグスラッグを使用します。

これを回避するには、カンマ区切りの文字列を渡すだけです。

function custom_tags( $query ) {
    $query->set( 'tag', 'custom,general' );
}
add_action( 'pre_get_posts', 'custom_tags' );
2
Howdy_McGee

たとえば、適切な tax_query を作成します。

'tax_query' => array(
    array(
        'taxonomy' => 'people',
        'field'    => 'slug',
        'terms'    => 'bob',
    ),
),

しかし、あなたのコード "update code"は他の理由でも失敗するでしょう。

  1. $currentは範囲外です。
  2. そしてあなたの変数は一重引用符で囲まれないでしょう

必要な最低限の変更は次のとおりです。

function custom_tags( $query ) {
  $current = substr($_SERVER[HTTP_Host], 0, -4);
  $query->set( 'tag', "general,{$current}" );
}
add_action( 'pre_get_posts', 'custom_tags' );

しかし、述べたように、私は適切なtax_queryを作成したいと思います

function custom_tags( $query ) {
  $current = substr($_SERVER[HTTP_Host], 0, -4);
  $tax = array(
    array(
        'taxonomy' => 'tag',
        'field'    => 'slug',
        'terms'    => $current,
        'operator' => 'IN' // This is default
      ),
    );
  $query->set( 'tag', "general,{$current}" );
}
add_action( 'pre_get_posts', 'custom_tags' );

演算子を変更して異なる動作をさせることができます。

オペレーター (ひも) - テストするオペレータ可能な値は、 'IN'、 'NOT IN'、 'AND'、 'EXISTS'、および 'NOT EXISTS'です。デフォルト値は 'IN'です。

そして、あなたのコードはサイト上のすべてのクエリに対して実行されます。それは多くのことを変更し、そして確かに物事を壊すでしょう。必要な場所だけに制限する必要があります。私はこれがいつどこでいつ実行されることになっているのか正確にはわかりませんが、これはスタートであるべきです:

function custom_tags( $query ) {
  if (is_admin() 
    || $query->is_main_query()
  ) {
    return;
  }
  $current = substr($_SERVER[HTTP_Host], 0, -4);
  $tax = array(
    array(
        'taxonomy' => 'tag',
        'field'    => 'slug',
        'terms'    => $current,
        'operator' => 'IN' // This is default
      ),
    );
  $query->set( 'tag', "general,{$current}" );
}
add_action( 'pre_get_posts', 'custom_tags' );
1
s_ha_dum