web-dev-qa-db-ja.com

wp_set_object_terms()はtermを置き換えているのではなく、新しいtermを作成しています

次のようなハードコードを使用している場合は、カスタムサブメニューページから。

$post_id = 111;
$flightCategory = array( 25 );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );

ページを更新すると、希望のカスタム分類法の用語がCPTに割り当てられます。しかし、<form>から値を取得している次のコードに進むと、以前のようには動作しません。

if( $flightID !== NULL && $flightCat !== '-1' && !empty( $flightCat ) ) {
    $flightCount = count( $flightID );
    foreach ( $flightID as $post_id ) {
        $flightCategory = array( $flightCat ); //inactive = 25, active = 26
        wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
    }
    $success = sprintf( __('<strong>SUCCESS:</strong> %d Flight information has been affected', 'textdomain'), $flightCount);
} else {
    $error = __('<strong>ERROR:</strong> You can\'t pass any empty field', 'textdomain');
}

このコードブロックが実行していること、それはスラッグ '25'を持つ '25'という名前の新しいTermを単に追加します。以下のような配列を渡さないようにしました。

$flightCategory = $flightCat;

しかし、結果は同じです。何がおかしいのですか?

3
Mayeenul Islam

どちらの場合も問題は他にはありませんが、2番目のパラメータに送信している主な値、あなたの場合は$flightCategoryです。

$flightCategory = array( 25 );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );

しかし、後のバージョンではどういうわけか、文字通りあなたは実際に以下のようなものを渡しています。

$flightCategory = array( '25' );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );

25に関するSINGLE QUOTEに注意しましたか?それが実際に問題を引き起こしています。最初のコードダンプであなたが見るでしょうので:

array(1) { [0]=> int(25) }

そして二番目に:

array(1) { [0]=> string(2) "25" }

あなたは実際に文字列を渡しています、そして関数はそれを理解しています、さて、私は 用語名 を得たので、それで。しかし、整数を使ってあなたが実際に言っているのは、{ちょっと関数、Term IDを取得しました。IDだけを追加/更新してください} _です。

溶液

問題を解決するためには、簡単なことをしなければなりません:

$flightCategory = (int)$flightCat; //make it integer whatever you get

または、

$flightCategory = array( (int)$flightCat );  //make the array value integer whatever you get

PHP型キャストについての詳細

9
Mayeenul Islam