web-dev-qa-db-fra.com

Emplacement du code dans le plug-in pour relier `save_post`

J'ai rencontré aujourd'hui un problème étrange lors du développement d'un nouveau plugin.

Je l'ai configuré comme d'habitude, en créant le dossier f711-roomprice dans le répertoire Plugindirectory et en créant le répertoire f711-roomprice.php ainsi qu'un répertoire inc.

Tout fonctionnait bien avec le crochet d'activation et les fonctions incluses, jusqu'à ce que je crée un include:

include('inc/filter-savepost.php');

ce fichier contient le code suivant:

add_action( 'save_post', 'f711_roomprice_meta_box_save' );  
function f711_roomprice_meta_box_save( $post_id ) {

    if( !isset( $_POST['f711_roomprice_prices'] ) ) return;

    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; 

    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'f711_roomprice_box_nonce' ) ) return; 

    if( !current_user_can( 'edit_post', $post_id ) ) return;

    foreach( $_POST['f711_roomprice_prices'] as $room => $seasons ) {
        foreach( $seasons as $season => $price ) {

            f711_roomprice_insert( $room, $season, $price );

        }

    }

}  

Après avoir inclus le fichier dans mon fichier de plugin principal, une erreur s'est produite, générant un écran blanc lors de l'enregistrement d'un message, tout le reste a bien fonctionné.

La fonction f711_roomprice_meta_box_save est appelée, confirme cela avec une wp_die('f711_roomprice_meta_box_saveis called') dedans.

Le plus étrange, c’est que j’ai placé le code (exactement le même que dans le fichier d’inclusion) dans mon fichier de plug-in principal, et ai bien sûr ignoré l’inclusion. Maintenant, cela fonctionne comme je le veux.

J'ai également essayé d'ajouter simplement l'action save_post dans le fichier de plug-in principal et d'inclure la fonction de inc/filter-savepost.php, mais le résultat obtenu était toujours aussi erroné qu'avant.

Qu'est-ce que je fais mal ici? L'emplacement du code (crochets, fonctions) est-il vraiment important dans un plugin ou est-ce simplement quelque chose qui a mal tourné?

2
fischi

En parcourant mes anciennes questions, j'ai rouvert celle-ci et testé certaines choses dans mon plugin.

La solution était assez simple, bien que je ne sois pas sûre que cela ait également quelque chose à voir avec une nouvelle version de WordPress.

J'ai refactoré le plugin et remarqué des encodages différents de ceux de la dernière fois que j'ai testé cela. Je ne sais pas comment je ne l'ai pas reconnu. Maintenant, tout étant UTF-8 without BOM, et joliment structuré en différents fichiers (comme prévu), cela fonctionne bien.

0
fischi

Je ne sais pas si

if( !current_user_can( 'edit_post', $post_id ) ) return;

fonctionne vraiment. Peut-être que l'utilisateur actuel n'est pas configuré là-bas et vous devrez le contourner en transmettant l'ID utilisateur dans un champ caché, puis en le récupérant à l'aide de

$user = get_user_by( 'id', esc_attr( $_POST['user_id'] ) );
wp_set_current_user( $user->user_id );
if ( ! current_user_can( 'edit_post', $post_id )
    wp_die( 'Not allowed' );
0
kaiser