J'écris un outil externe qui insère post dans wordpress (j'utilise les fonctions wordpress). J'ai aussi lu cette discussion: wp_insert_post n'écrit pas mon post_name
Mais mon problème est un peu différent. Je fais l'insertion de post, mais post_name est vide. Le code est:
// Create post object
$my_post = array(
'post_title' => $article_title,
'post_name' => $article_title,
'post_content' => $article_content,
'post_status' => 'pending',
'post_author' => 1,
'post_category' => array(8,39)
);
// Insert the post into the database
wp_insert_post( $my_post );
J'ai essayé avec et sans le post_name, mais le résultat n'a pas changé. J'ai aussi essayé après:
$post_ID = (int) $wpdb->insert_id;
$post_name = wp_unique_post_slug($article_title, $post_ID, $post_status, $post_type, $post_parent);
$where = array( 'ID' => $post_ID );
$wpdb->update( $wpdb->posts, array( 'post_name' => $post_name ), $where );
Mais par exemple, insérez le post_name mais:
Qu'est-ce que je fais mal?
Premièrement, vous ne devriez pas utiliser post_category
, car selon le codex wordpress wp_insert_post () :
'post_category' => [array (, <...>)] // post_category n'existe plus, essayez wp_set_post_terms () pour définir les catégories d'un article.
Deuxièmement, si vous voulez que le titre du post soit votre slug, vous ne devriez pas avoir besoin d'utiliser le paramètre post_name
, car il est construit à partir du titre par défaut. Il est conseillé de s’assurer que votre titre est exempt de balises, en modifiant la ligne correspondante en:
'post_title' => wp_strip_all_tags( $article_title ),
Si vous voulez vraiment ajouter le paramètre post_name
manuellement, assurez-vous de désinfecter et assurez unicité :
'post_name' => wp_unique_post_slug( sanitize_title( $article_title ) ),
Mis à part les points ci-dessus, votre code me semble correct. La seule autre chose à l'esprit sur le fait de ne pas obtenir un nom de publication serait liée à la valeur pending
du paramètre post_status
que vous avez choisi. Consultez le code source vous-même. Si je ne me trompe pas totalement, cela signifie que si le statut du post change en état de publication (publication ou privé, par exemple), une mise à jour est effectuée et le nom du post est ensuite inséré dans la base de données. Avant - avec les statuts de publication auto-brouillon, brouillon ou en attente - cela ne se produit pas.