J'essaie d'ajouter une méta-boîte personnalisée à mon thème en suivant le tutoriel: https://www.sitepoint.com/adding-meta-boxes-post-types-wordpress/ .
Je peux voir la boîte de méta et il obtient la valeur de la base de données (essayé en mettant à jour manuellement le post-méta). Cependant, il n'est jamais mis à jour. J'ai essayé de déboguer par var_dump (ing) le tableau $_POST
, il montre que la valeur de la variable est vide, mais la valeur est présente dans $_REQUEST
. Est-ce que quelqu'un sait quelle est la raison de cela?
La variable manquante s'appelle post-excerpt
. Voici mon code.
function buziness_add_custom_box() {
// Adding layout meta box for page
add_meta_box(
'offer-post-excerpt',
esc_html__( 'Excerpt', 'buziness'),
'buziness_post_excerpt',
'post',
'normal',
'default'
);
}
Suivant est la fonction de rappel:
function buziness_post_excerpt($post){
// Add a nonce field so we can check for it later
// Use nonce for verification
wp_nonce_field( basename( __FILE__ ) , 'custom_excerpt_nonce' );
$value = get_post_meta($post->ID, '_excerpt', true );
echo '<textarea style="width:100%" id="post_excerpt" name="post_excerpt">' . esc_attr( $value ) . '</textarea>';
echo "<p>Excerpts are optional hand-crafted summaries of your content that can be used in your theme</p>";
}
C'est la fonction accrochée à save_post
hook
add_action('save_post', 'buziness_save_post_excerpt');
/**
* save the custom excerpt metabox data
* @hooked to save_post hook
*/
function buziness_save_post_excerpt($post_id) {
// Checks save status
var_dump($_POST);
var_dump($_REQUEST);
wp_die($_REQUEST);
$is_autosave = wp_is_post_autosave( $post_id );
$is_valid_nonce = ( isset( $_POST[ 'custom_excerpt_nonce' ] ) && wp_verify_nonce( $_POST[ 'custom_excerpt_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';
// Exits script depending on save status
if ( $is_autosave || !$is_valid_nonce ) {
return;
}
// Check the user's permissions.
if ( isset( $_POST['post_type'] ) && 'post' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return;
}
}
else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
}
// Checks for input and sanitizes/saves if needed
if( isset( $_POST[ 'post_excerpt' ] ) ) {
update_post_meta( $post_id, '_excerpt', sanitize_text_field( $_POST[ 'post_excerpt' ] ) );
}
}
Voici la partie de la sortie de var_dump($_POST)
'ping_status' => string 'open' (length=4)
'add_comment_nonce' => string 'c641d598b3' (length=10)
'_ajax_fetch_list_nonce' => string '1e9f1f3f06' (length=10)
'post_name' => string 'online-training' (length=15)
'post_author_override' => string '1' (length=1)
'custom_excerpt_nonce' => string '0cd0a833c4' (length=10)
'post_excerpt' => string '' (length=0)
'post_mime_type' => string '' (length=0)
'ID' => int 96
et la partie de sortie de var_dump($_REQUEST)
'ping_status' => string 'open' (length=4)
'add_comment_nonce' => string 'c641d598b3' (length=10)
'_ajax_fetch_list_nonce' => string '1e9f1f3f06' (length=10)
'post_name' => string 'online-training' (length=15)
'post_author_override' => string '1' (length=1)
'custom_excerpt_nonce' => string '0cd0a833c4' (length=10)
'post_excerpt' => string 'TES t ' (length=6)
Comme vous pouvez le constater, la valeur de 'post_excerpt
' est vide dans la sortie de $_POST
.
Utiliser $_REQUEST
est une mauvaise pratique. Entre les demandes post
, les demandes get
et les cookies, vous ne pouvez pas être certain que vous traitez une entrée d'utilisateur réelle et pas des déchets laissés dans l'URL ou dans la mémoire du navigateur.
Les méta-boîtes sont "validées", utilisez donc uniquement $_POST
lors de leur traitement.
L'autre aspect de votre code est que vous essayez d'accéder à des éléments n'appartenant pas à "votre code". Préférez toujours utiliser l’API qui existe pour cela au lieu d’essayer d’y accéder depuis des emplacements globaux. Bien que je ne vois aucune raison pour laquelle quiconque le ferait, quelqu'un à un moment donné aura probablement une bonne idée de supprimer certaines valeurs de $_POST
pour des raisons imaginaires (ou moins imaginaires). De plus, des API telles que les gestionnaires de sauvegarde seront appelées pour gérer les "sauvegardes" qui ne sont pas du tout générées par un navigateur. Dans ce cas, ces variables globales peuvent être: vider ou contenir des ordures.
Ohhhhhhhhhhhhh, vous utilisez des noms pour vos champs qui ne sont en aucun cas préfixés. C'est une grosse boîte de Pandore en soi. Toujours préfixer tout ce qui est dans la portée globale.