J'ai deux champs dans la table wp_posts que wp_update_post()
semble être incapable de changer. J'essaie d'utiliser le code suivant:
$echo $group_access;
$echo $tag_list;
$my_post = array(
'ID' => 12095,
'post_title' => 'Test Title',
'post_content' => 'Test Content',
'group_access' => $group_access,
'tag_list' => $tag_list,
);
// Update the post into the database
$post_id = wp_update_post( $my_post, true );
if (is_wp_error($post_id)) {
$errors = $post_id->get_error_messages();
foreach ($errors as $error) {
echo $error;
}
}
Les variables $group_access
et $tag_list
font écho aux valeurs correctes. Le post_title
et le post_content
sont mis à jour correctement. group_access
et tag_list
ne sont pas mis à jour et il n'y a pas d'erreur non plus.
Naturellement, j'ai vérifié la table et group_access
et tag_list
sont les en-têtes de colonne corrects.
Je suis déconcerté pourquoi cela ne fonctionne pas. wp_update_post()
est-il incapable de modifier les colonnes qui ne font pas partie de l'installation par défaut de WP? Est-ce éventuellement une question de type de données (par exemple, je devrais passer un tableau ou un entier, mais je passe une chaîne)?
Vous avez raison; WordPress ne mettra pas à jour les colonnes de base de données personnalisées à l'aide de wp_update_post()
ou wp_insert_post()
. Au lieu de créer des colonnes de base de données personnalisées, envisagez d'utiliser des API post-méta et/ou taxonomiques.
Si vous devez authentifier la table wp_posts
, vous devrez mettre à jour vous-même vos colonnes personnalisées et vous rencontrerez peut-être des problèmes avec divers autres plugins qui ne prennent pas en compte les colonnes de la base de données personnalisée.
wp_insert_post_data
se déclenche presque immédiatement avant que les données de publication ne soient insérées dans la base de données. La seule chose qui se produit après cela est que les $ data sont wp_unslash()
. Vous devriez pouvoir utiliser ce filtre pour comparer le $ postarr que vous avez envoyé à wp_update_post avec le $ postarr transmis à ce filtre. Si les deux sont différents, vous pouvez alors formater les données $ avant leur insertion dans la base de données.
Je me suis vite moqué de ça. Je ne l'ai pas testé, mais cela devrait fonctionner avec des modifications mineures.
Dans la classe wpse-258786.php:
class wpse_258786 {
protected $postarr;
public function __construct( $postarr ) {
$this->postarr = $postarr;
}
public function insert_post_data( $data, $postarr ) {
//* Make sure this is added each time before each post
remove_action( 'wp_insert_post_data', [ $this , 'insert_post_data' ] , 10 );
if( $postarr !== $this->postarr ) {
//* Format the $data to insert into table
}
return $data;
}
}
dans votre-fichier.php
include_once( PATH_TO . 'class-wpse-258786.php' );
...
$echo $group_access;
$echo $tag_list;
$my_post = array(
'ID' => 12095,
'post_title' => 'Test Title',
'post_content' => 'Test Content',
'group_access' => $group_access,
'tag_list' => $tag_list,
);
//* Filter the post data before inserting into database
add_action( 'wp_insert_post_data',
[ new wpse_258786( $my_post ), 'insert_post_data' ], 10, 2 );
// Update the post into the database
$post_id = wp_update_post( $my_post, true );
Modifier pour ajouter: Ce que je ferais serait de placer la classe dans un fichier séparé, de l'inclure une fois, puis d'ajouter le filtre à la classe. Puis juste avant wp_update_post()
, ajoutez le filtre avec les données de publication dans le constructeur. Lorsque le crochet se déclenche, vous pouvez alors retirer le filtre pour vous assurer qu'il ne se déclenche pas plus d'une fois.
En réponse à votre commentaire, vous pourriez utiliser $ wpdb, et en fait, c'est comme ça que wp_insert_post()
le fait. Le grand avantage de l’abstraction wp_insert_post()
est qu’elle introduit de nombreux crochets d’action et de filtrage que nous pouvons utiliser pour modifier les données avant leur saisie dans la base de données. Vérifiez la fonction wp_insert_post()
sur trac.