Désolé si cela est déjà répondu ici. J'ai regardé autour de moi et je ne pouvais voir aucune réponse à ma question. J'ai donc pensé poster la mienne.
Je construis un plugin pour un client qui recueille les commentaires des clients sur un projet récemment terminé.
L'administrateur utiliserait le système pour envoyer un "invite" au client lui demandant de lui faire part de ses commentaires avec un lien vers un formulaire sur le site.
J'ai créé un type de publication personnalisé appelé "customer_prompts" qui ne comporte qu'un champ de titre et quelques champs personnalisés stockés dans une table de base de données personnalisée, et non des méta-publications.
Vous trouverez ci-dessous le code de l’action save_post. Il semble que lorsque je clique sur publier, l'action save_post n'est pas déclenchée et la valeur du titre n'est enregistrée que dans wp_posts.
add_action('save_post', 'save_Prompt');
function save_Prompt($post_id){
$post = get_post($post_id);
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( 'customer_Prompt' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return;
}
global $wpdb;
$Prompt_id = com_create_guid();
$customer_feedback_name = $_POST['_sdg_customer_feedback_name'];
$customer_feedback_email = $_POST['_sdg_customer_feedback_email'];
$salesperson = $_POST['_sdg_salesperson'];
$values = array(
'id' => $Prompt_id,
'sdg_customer_name' => $customer_feedback_name,
'sdg_customer_email' => $customer_feedback_email,
'sdg_salesperson' => $salesperson,
'sdg_post_id' => $post->id
);
$insert = $wpdb->insert($table_name, $values);
if($insert) {
mail($customer_feedback_email, 'hello', 'hello');
}
}
Toute aide serait grandement appréciée, car je ne peux pas comprendre ce qui se passe ici.
Merci, Jamie.
L'action "save_post" n'est appelée que lorsque nous avons réellement modifié quelque chose dans le formulaire de page de publication. Si nous appuyons simplement sur le bouton de mise à jour, sans rien changer, l'action "save_post" n'est pas appelée.
Ceci est important si nous modifions un type de publication personnalisé contenant des méta-boîtes personnalisées. Si nous nous appuyons sur l'action "save_post" et ne modifions que les éléments de nos boîtes à méta personnalisées, rien ne se passera.
La solution consiste à utiliser le hook d'action "pre_post_update" au lieu de "save_post"
http://wordpress.org/support/topic/save_post-not-working-getting-called#post-2335557
edit Avez-vous essayé de placer print_r('hello world'); die();
après function save_Prompt($post_id){
pour vous assurer que la fonction est bien capturée par le crochet d’action? /modifier
Plusieurs problèmes pourraient être en jeu:
1: Votre global wpdb
doit être au sommet de votre fonction, avant toutes vos déclarations conditionnelles if.
2: Vos variables $_POST
doivent avoir des conditions de if(isset($_POST['food'))
pour vérifier si les données enregistrées sont en cours de définition avant d’atteindre votre fonction, sinon cela pourrait provoquer une erreur fatale, empêchant la saisie des données dans la base de données.
3: Essayez global $post
en haut de la fonction, vous pouvez ensuite appeler les variables de la publication telles que $post->post_type
en tant qu’objet par le biais de la variable $post
.
4: Ajoutez $wpdb->print_errors; die();
après $insert = $wpdb->insert($table_name, $values);
si votre requête de base de données est incorrecte.
J'espère qu'un de ceux-ci devrait résoudre votre problème.
je pense que le var_dump dans add_action ('save_post', la fonction de rappel ne s'affiche pas!
ajouter
$fp = fopen('c:\data.txt', 'w');
fwrite($fp, print_r($post_id, true));
fclose($fp);
et vérifier si 'data.txt' existe, oui c'est vrai par save_post.
:)
Cela m'est arrivé Il s'est avéré que j'avais un ensemble de modèles de page (une valeur post-méta pour _wp_page_template
) dans un modèle qui n'existait plus, après avoir changé de thème. Ce morceau de code dans wp-includes/post.php
:
if ( ! empty( $postarr['page_template'] ) ) {
$post->page_template = $postarr['page_template'];
$page_templates = wp_get_theme()->get_page_templates( $post );
if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {
if ( $wp_error ) {
return new WP_Error( 'invalid_page_template', __( 'Invalid page template.' ) );
}
...
abandonne avant de tirer save_post
.
J'ai eu ce problème aussi et j'ai pensé ajouter des réponses potentielles pour aider quelqu'un à gagner du temps. C'était un problème très simple qui m'a pris des jours pour identifier (je suis 'un peu plus chauve en ce moment - et je me sens un peu idiot) ...
Il s’avère qu’un formulaire metabox en cours de création contenait un champ "action" remplaçant le champ "action" du formulaire généré par WordPress - le formulaire n’était utilisé que sur une publication personnalisée et l’action incorrecte était donc transmise. sur WordPress sur POST sur ' wp-admin/post.php ' et il a fini par être géré par le gestionnaire par défaut (à la fin de l'instruction switch).
Un autre effet secondaire était que lors de la mise à jour ou de la publication, WordPress était redirigé vers l’index intégré de publication, au lieu de revenir directement à la publication modifiée.
La solution consistait à supprimer l'élément de formulaire masqué "action" du métabox.
J'espère que cela aide quelqu'un là-bas ...
Tout d'abord, je suggérerais de configurer votre site WordPress pour qu'il soit facile à déboguer http://codex.wordpress.org/Debugging_in_WordPress
De cette façon, il est facile de voir stuff;)
Pour l’accrochage d’action, je pense que vous devez l’accrocher comme ceci:
add_action('save_post', 'save_Prompt', 10, 2);
function save_Prompt( $post_id, $post ){
//do whatever
}
le hook save_post
passe 2 arguments.