Joindre des données de taxonomie à publier avec wp_insert_post

17

J'essaie de mettre en œuvre un système d'affichage frontal qui affiche les données de taxonomie dans plusieurs champs de sélection déroulants. Chacune des listes déroulantes est nommée en utilisant le "nom" $argdans wp_dropdown_categories().

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

Comme vous pouvez le voir, la taxonomie est "emplacement" et le nom sélectionné est également "emplacement".

J'ajoute ensuite les variables pour chacune des listes déroulantes de sélection de taxonomie comme ceci avec post_title, post_content etc:

$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'] );

Enfin, j'ajoute les informations supplémentaires dans un tableau prêt à être envoyé par wp_insert_post(). Je ne sais pas si je fais la bonne chose en ajoutant tax_inputdans le tableau comme ci-dessous car c'est ce que je comprends du codex que je dois faire.

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

Pour que tout finisse par ressembler à ceci:

$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 );

Cependant, lorsque j'ai soumis le nouveau message, toutes les données standard du message (et aussi mon type de message personnalisé) vont bien, mais les taxonomies ne le font pas. Je fais évidemment quelque chose de mal mais quoi?

MartinJJ
la source

Réponses:

25

À utiliser wp_set_object_termsaprès avoir identifié l'ID de publication pour chaque taxonomie:

...
$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' );
Bainternet
la source
Je ne sais pas où je serais sans votre aide, j'ai travaillé pour la première fois ... merci beaucoup Bainternet. Marqué comme ayant répondu
MartinJJ
Heureux d'avoir pu aider :)
Bainternet
Les tableaux $ location et $ sale_rental sont-ils des entiers ou des chaînes?
Doug
5

Vous pouvez le faire en utilisant wp_insert_post , mais vous devez également spécifier la taxonomie tax_input, donc cela devrait ressembler à ceci:

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

j'utilise implode() donc cela $locationpourrait être un tableau avec plusieurs termes.

Notez également que cela ne fonctionne que pour les taxonomies non hiérarchiques. Pour les taxonomies hiérarchiques, vous devez fournir un tableau au lieu de astring.

Tomáš Kapler
la source
2

Source du problème

Après quelques recherches sur ce sujet, on m'a dit de vérifier les internes (ce que j'ai fait). Comme j'importais des publications à partir d'un flux externe en tant que type de publication personnalisé, j'ai simplement défini l'utilisateur -1(au lieu d'ajouter un utilisateur de bot). Le problème que j'ai rencontré était wp_insert_post()qu'avec untax_input ensemble, vérifie en interne la capacité d'un utilisateur, ce qu'un utilisateur non existant n'a évidemment pas.

SysBot pour le sauvetage

La solution était alors d'écrire le plugin SysBot . De cette façon, je pouvais simplement attacher l'utilisateur SysBot (qui a le rôle d' éditeur ) à ce message nouvellement créé et tout fonctionnait comme prévu.

kaiser
la source