web-dev-qa-db-ja.com

Wp_insert_postを使用して投稿する分類データの添付

私はいくつかのドロップダウン選択フィールドに分類データを表示するフロントエンド投稿システムを実装しようとしています。それぞれのドロップダウンは、 wp_dropdown_categories() の "name" $argを使って命名されています。

wp_dropdown_categories( array(
    'taxonomy'      => 'location',
    'hide_empty'    => 0,
    'orderby'       => 'name',
    'order'         => 'ASC',
    'name'          => 'location',
) );

ご覧のとおり、分類法は "location"で、選択名も "location"です。

それから、post_title、post_contentなどとともに、分類法選択ドロップダウンのそれぞれに変数を追加します。

$title          = trim( $_POST['wpuf_post_title'] );
$content        = trim( $_POST['wpuf_post_content'] );
$tags           = wpuf_clean_tags( $_POST['wpuf_post_tags'] );
$customcategory = trim( $_POST['customcategory'] );
$cat            = trim( $_POST['cat'] );
$location       = trim( $_POST['location'] );
$sale_rental    = trim( $_POST['sale_rental'] );
$price          = trim( $_POST['price'] );

最後に、追加情報を wp_insert_post() で送信できるように配列に追加します。 tax_inputを以下のように配列に追加することで正しいことをしているかどうかは、私は非常に困惑しています。

'tax-input' => array( 
    $location,
    $sale_rental,
    $price
),

その結果、すべてが次のようになります。

$my_post = array(
    'post_title'    => $title,
    'post_content'  => $content,
    'post_status'   => $post_status,
    'post_author'   => $userdata->ID,
    'post_category' => array( $_POST['cat'] ),
    'post_type'     => $customcategory,
    'tags_input'    => $tags,
    'tax_input'     => array( 
        $location,
        $sale_rental,
        $price
    ),
);

$post_id = wp_insert_post( $my_post );

ただし、新しい投稿を送信したときには、標準の投稿データ(およびカスタム投稿の種類)はすべて問題ありませんが、分類法は問題ありません。私は明らかに何か悪いことをしているんだけど何?

17
MartinJJ

各分類法の投稿IDを取得したら、 wp_set_object_terms を使用します。

...
$post_id = wp_insert_post( $my_post );
wp_set_object_terms( $post_id, $location, 'location' );
wp_set_object_terms( $post_id, $sale_rental, 'sale_rental' );
wp_set_object_terms( $post_id, $price, 'price' );
24
Bainternet

wp_insert_post を使用して行うことができますが、tax_inputでも分類法を指定する必要があるので、以下のようになります。

$item['tax_input'] = array (
    'location'      => implode( ',', $location ),
    'sale_rental'   => implode( ',', $sale_rental ),
    'price'         => implode( ',', $price ),
)

$locationが複数の用語を含む配列になるように、 implode() を使用します。

また、これは非階層的分類法でのみ機能することに注意してください。階層分類法では、文字列の代わりに配列を指定する必要があります。

5
Tomáš Kapler

問題の原因

このトピックを調べた後、内部をチェックするように指示されました(これは私が行いました)。カスタム投稿タイプとして外部フィードから投稿をインポートしていたので、(ボットユーザーを追加するのではなく)単にユーザーを-1に設定しました。私が遭遇した問題は、tax_inputが設定されたwp_insert_post()が内部的にユーザー機能をチェックするということでした。

救助のためのSysBot

その解決策は、私が SysBotプラグイン を書いたことです。このようにして、SysBotユーザー(editorの役割を持つ)をその新しく作成された投稿に添付するだけで、すべてが期待通りに機能しました。

2
kaiser