J'ai du mal à comprendre ce qui ne va pas avec mon code. J'ai créé une méta-boîte pour un type de publication personnalisé (projet) qui ajoute des personnes au projet via la page de modification du projet. La zone affiche également les utilisateurs qui ont été ajoutés aux projets, mais la méthode POST ne semble pas fonctionner et aucun code qui insère les données dans la base de données ne se produit. J'ai essayé de faire écho à une valeur du formulaire mais il n'y a pas de résultat, donc je sais que la méthode de publication ne fonctionne pas. J'ai aussi vérifié les erreurs de syntaxe.
Voici le code de la méthode POST une fois le formulaire soumis -
<?php
// Process add form if sent
if(isset($_POST['mro_add_user'])) {
$_POST = stripslashes_deep($_POST);
$add_username = $_POST['mro_add_user'];
if (username_exists($add_username) != NULL) {
// Check not already registered
$add_userid = username_exists($add_username);
$extra_userdata = get_userdata($add_userid);
$add_firstname = $extra_userdata->first_name;
$add_lastname = $extra_userdata->last_name;
$a_registered = $wpdb->get_var("SELECT user_id FROM ".$wpdb->prefix."mro_attendees WHERE event_id = ".$project_id." AND user_id = ".$add_userid);
// If not already registered
if ($a_registered == "") {
$user_comment = $_POST['mro_add_comment'];
$wpdb->insert($wpdb->prefix.'mro_attendees', array( 'event_id' => $project_id, 'user_id' => $add_userid, 'first_name' => $add_firstname, 'last_name' => $add_lastname, 'user_comment' => $user_comment ) );
?>
<div class="updated"><p><strong><?php _e('User ' . $add_username . ' added.' ); ?></strong></p></div>
<?php
} else {
?>
<div class="updated"><p><strong><?php _e('User ' . $add_username . ' already on list.' ); ?></strong></p></div>
<?php
}
} elseif(username_exists($add_username) == NULL) {
?>
<div class="updated"><p><strong><?php _e('User ' . $add_username . ' not found.' ); ?></strong></p></div>
<?php
}
}
?>
Et voici la forme qui a l'action les deux sont dans le même document de code.
<form id="add_user" name="add_user" method="post" action="post.php?post=<?php echo $project_id; ?>&action=edit">
<p>
<label for="mro_add_user"></label>
Username<br />
<input name="mro_add_user" type="text" id="mro_add_user" size="40" maxlength="150" />
</p>
<p>Comment<br />
<label for="mro_add_comment"></label>
<input name="mro_add_comment" type="text" id="mro_add_comment" size="40" maxlength="40" />
</p>
<p>
<input type="submit" name="mro_add_user_submit" id="mro_add_user_submit" value="Add User" />
</p>
</form>
J'ai une méthode GET pour quelque chose d'autre dans ce code qui fonctionne.
<a href="post.php?post=<?php echo $project_id; ?>&action=edit&remove_attendee=<?php echo $user->id; ?>&place=<?php echo $num; ?>">Remove User</a>
Je ne comprends pas pourquoi la méthode GET fonctionne mais POST ne fonctionne pas? Est-ce quelque chose que la méta-boîte ne peut pas faire? Y a-t-il un autre moyen de faire cela dans la boîte à méta? Toute aide ou vision serait grandement appréciée!
Premièrement, avez-vous inspecté la méta-boîte html à partir du navigateur?
Vous pouvez trouver que l'élément de formulaire que vous avez ci-dessus est manquant. En effet, vous ne pouvez pas avoir d'éléments de formulaire imbriqués:
<form>
<form>
</form>
</form>
Toutes les méta-boîtes sont déjà à l'intérieur d'un élément de formulaire, vous ne pouvez donc pas spécifier un autre élément de formulaire à l'intérieur.
Une solution serait d'utiliser une fonction Javascript AJAX pour soumettre votre ajout de noms d'utilisateur:
Partie Javascript:
jQuery.ajax({
url: 'http://yoursite.com/wp-admin/admin-ajax.php',
dataType: 'json',
//type:'POST',
data: {
'action':'your_ajax',
'fn': 'add_users_to_project',
'data': data
},
success: function(results){
//console.log(results);
//display your added usernames
},// end of success
error: function(errorThrown){console.log(errorThrown);}
});// end of ajax
Partie PHP:
class your_ajax{
//add actions and filters in constructor
function __construct(){
//admin or front end?
//add_action('wp_ajax_nopriv_your_ajax', array( $this, 'ajax_function' ) );
add_action('wp_ajax_your_ajax', array( $this, 'ajax_function' ) );
}
//handle ajax calls from
function ajax_function(){
// the first part is a SWTICHBOARD that fires specific functions
// according to the value of Query Var 'fn'
//feel free to use this file for any wordpress ajax that needs to be done
switch($_REQUEST['fn']){
case 'add_users_to_project':
//$output = $_REQUEST['data'];
$output = $this->add_users_to_project( $_REQUEST['data'] );
break;
case 'delete_users_from_project':
//$output = $_REQUEST['data'];
$output = $this->delete_users_from_project( $_REQUEST['data'] );
break;
default:
$output = 'No function specified, check your jQuery.ajax() call';
break;
}
// Now, convert $output to JSON and echo it to the browser
// That way, we can recapture it with jQuery and run our success function
ob_clean();
$output=json_encode($output);
if( is_array( $output ) ):
print_r( $output );
else:
echo $output;
endif;
die();
}
function add_users_to_project( $data ){
//do whatever
return $response;
}
function delete_users_from_project( $data ){
//delete whatever
return $response;
}
}//end your_ajax class
$your_ajax = new your_ajax();
Une autre option serait d’ajouter une fonction au crochet d’action save_post
qui se déclenchera lorsque la publication du projet sera enregistrée. Ensuite, affichez simplement tous les utilisateurs dans votre méta-boîte.
add_action( 'save_post', 'your_save_function' );
function your_save_function(){
//do stuff with global $post and $_POST
}
Désolé pour la longue réponse ... J'espère que vous trouverez une solution adaptée à vos besoins.