web-dev-qa-db-fra.com

post_name vide après wp_insert_post

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:

  1. n'est pas unique
  2. pas désinfecter, par exemple, "Test" n'est pas devenu "test"

Qu'est-ce que je fais mal?

2
user41544

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.

6
Nicolai