J'ai cherché autour mais je ne peux pas tout à fait trouver la réponse. J'essaie d'utiliser le contenu d'un champ personnalisé en tant que post_data et de l'enregistrer dans la base de données en tant que telle lorsqu'un message est créé ou mis à jour. Je dois le faire afin de mettre au point une solution de publication frontale à l’aide du plugin Advanced Custom Fields.
Je pense avoir besoin de quelque chose comme ça:
function tsv_content_save_pre( $post_id ){
global $post;
$tsvpost = get_post($post_id);
$tsvifempty = $tsvpost->post_content; //The "real" post_content
$tsvcontent = get_field('article_content'); //The custom content
if ($tsvifempty == NULL) { //Check if the "real" post content has anything in it first.
$tsvargs = array('post_content' => $tsvcontent);
wp_update_post ($tsvargs);
}
}
add_filter('content_save_pre' , 'tsv_content_save_pre' );
Mais je suis coincé là. Je ne suis pas un développeur de plugins, donc les filtres et autres sont difficiles pour moi. Quelqu'un peut-il m'aider à me faire pointer dans la bonne direction?
Merci d'avance.
Tout d'abord, content_save_pre
est un très vieux crochet. Adam Brown a un avertissement qui:
Ce raccordement ne se produit pas dans la version la plus récente de WordPress (3.5). Ne l'utilisez pas . Il est déconseillé. Vous devriez regarder la liste des "crochets liés" ci-dessous pour voir si vous pouvez trouver ce qui l’a remplacé.
Je suggérerais une solution similaire à celle que j'avais proposée pour une question demandant de limiter les changements d'état en fonction du contenu. Nombre de mots .
En suivant votre code de très près, la solution devrait ressembler à ceci:
function cmeta_as_content_wpse_92012($data){
if (!empty($data['post_content'])) {
$tsvcontent = get_field('article_content'); //The custom content
$data['post_content'] = $tsvcontent;
}
return $data;
}
add_action('wp_insert_post_data','cmeta_as_content_wpse_92012');
Mais j'ai des soucis:
get_field
fonctionnera dans ce contexteget_field
, il semblerait que la fonction extrait les données de la base de données. Elle ne vous aidera donc pas à mettre à jour un message. Eh bien, à moins que vous ne mettiez à jour le message et le postmeta, puis que vous l'exécutiez. une autre requête pour modifier les données de publication, ce qui semble excessif. Et votre question précise "avant d'écrire dans la base de données".Donc, au lieu de ce qui précède, je pense que je voudrais analyser les données $_POST
directement.
function cmeta_as_content_wpse_92012($data){
global $_POST;
if (!empty($data['post_content']) && !empty($_POST['meta'])) {
foreach ($_POST['meta'] as $v) {
if ('article_content' == $v['key']) {
$data['post_content'] = wp_kses( $v['value'] ); // The custom content
}
}
}
// var_dump($_POST,$data); die; // debugging
return $data;
}
add_action('wp_insert_post_data','cmeta_as_content_wpse_92012',1);
Encore plus de mises en garde:
wp_kses
article_content
--, le dernier, et seul le dernier, sera utilisé.Je pense que vous devez avoir un identifiant de publication dans votre tableau d'arguments. De la doc :
Remplir le champ ID n'est pas strictement nécessaire, mais sans cela, il serait inutile d'utiliser la fonction.
$tsvargs = array(
'ID' => $post_id,
'post_modified' => date("Y-m-d H:i:s"),
'post_modified_gmt' => date("Y-m-d H:i:s"),
'post_content' => $tsvcontent
);
$post_id = wp_update_post($tsvargs);
if ($post_id == 0) {
// handle error here
}
OK, via WPQuestions.com, j'ai pu trouver quelqu'un pour comprendre cela. Il nécessite 2 fonctions, une pour gérer l'affichage sur le front-end et une autre pour gérer l'affichage sur le back-end. Du fait qu'ACF utilise une fonction personnalisée appelée acf/save_post au lieu de WP native save_post, des travaux supplémentaires ont été nécessaires.
Voici la solution de travail finale:
//Save ACF field as post_content for back-end
add_action('save_post', 'change_content');
function change_content($post_id) {
$post_content = get_post_meta($post_id,'article_content',true);
$my_post = array();
$my_post['ID'] = $post_id;
$my_post['post_content'] = $post_content;
remove_action('save_post', 'change_content');
wp_update_post( $my_post );
add_action('save_post', 'change_content');
}
//Save ACF field as post_content for front-end
add_action('acf/save_post', 'change_content_frontend');
function change_content_frontend($post_id) {
$post_content = get_post_meta($post_id,'article_content',true);
$my_post = array();
$my_post['ID'] = $post_id;
$my_post['post_content'] = $post_content;
remove_action('acf/save_post', 'change_content_frontend');
wp_update_post( $my_post );
add_action('acf/save_post', 'change_content_frontend');
}
Espérons que cela aide quelqu'un qui essaie de faire quelque chose de similaire!