web-dev-qa-db-fra.com

Changer le contenu avant d'écrire dans la base de données

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.

1
Eckstein

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:

  1. Je ne sais pas si get_field fonctionnera dans ce contexte
  2. Si j'ai trouvé la bonne documentation pour get_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:

  1. Je ne me souviens pas à quelle étape WordPress applique ses propres filtres. J'ai donc appliqué wp_kses
  2. L'élément n ° 1 est peut-être excessif
  3. L'élément n ° 1 peut ne pas être la fonction de validation particulière souhaitée
  4. S'il existe plusieurs méta-champs personnalisés avec la même clé - article_content--, le dernier, et seul le dernier, sera utilisé.
3
s_ha_dum

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
}
0
montrealist

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!

0
Eckstein