web-dev-qa-db-fra.com

Association de données de taxonomie à publier avec wp_insert_post

J'essaie de mettre en place un système de comptabilisation frontal qui affiche les données de taxonomie dans plusieurs champs de sélection déroulants. Chacune des listes déroulantes est nommée à l'aide du "nom" $arg dans 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 choisi est également "emplacement".

J'ajoute ensuite les variables pour chaque liste de taxonomie sélectionnée, ainsi que 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 trop si je fais ce qu'il faut en ajoutant tax_input dans 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 envoyé le nouveau message, toutes les données de message standard (ainsi que mon type de message personnalisé) sont correctes, mais pas les taxonomies. Je fais évidemment quelque chose de mal mais quoi?

17
MartinJJ

Utilisez wp_set_object_terms après avoir obtenu l’identifiant 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' );
24
Bainternet

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

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

J'utilise implode() afin que $location puisse ê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.

5
Tomáš Kapler

Source du problème

Après quelques recherches sur ce sujet, on m'a demandé de vérifier les éléments 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 sur -1 (au lieu d'ajouter un utilisateur bot). Le problème que j’ai rencontré est que wp_insert_post() avec un ensemble tax_input vérifie en interne une capacité utilisateur, qu’un utilisateur non existant n’a évidemment pas.

SysBot pour le sauvetage

La solution a alors été que j'ai écrit le plugin SysBot . De cette façon, je pourrais simplement attacher l’utilisateur SysBot (qui a le rôle de éditeur) à ce nouveau message et tout a fonctionné comme prévu.

2
kaiser