web-dev-qa-db-fra.com

Les paramètres GET interfèrent avec les paramètres de mon plugin

Mon plugin est entièrement configuré à l’aide de l’API de configuration et fonctionne, mais j’ai deux fonctions manuelles dans mon plugin qui peuvent être exécutées par l’utilisateur admin en visitant les URL suivantes.

<?php echo admin_url(); ?>options-general.php?page=wordpress-file-monitor-plus&sc_wpfmp_action=1&sc_wpfmp_scan=1
<?php echo admin_url(); ?>options-general.php?page=wordpress-file-monitor-plus&sc_wpfmp_action=1&sc_wpfmp_reset_settings=1

J'utilise le hook admin_init pour rechercher ces paramètres GET et effectuer ces fonctions.

Les fonctions fonctionnent correctement et l'utilisateur est de retour sur la page des paramètres de mon plugin, mais les paramètres GET sont toujours dans l'URL. Ce n’est pas un gros problème, mais si l’utilisateur poursuit en sauvegardant les paramètres, ces paramètres GET sont envoyés à nouveau et exécutent à nouveau ces fonctions.

Pourquoi l'API de paramètres envoie-t-elle ces paramètres lors de la soumission du formulaire de paramètres? L'action du formulaire consiste à soumettre à options.php.

Le seul moyen de résoudre mon problème, c’est que, une fois que ces fonctions manuelles ont exécuté leur code dans admin_init, vous devez exécuter une redirection vers la page des paramètres sans les paramètres GET, mais si je le fais, je perdrai mes notifications d’administrateur. en essayant de montrer à l'utilisateur.

Quoi qu'il en soit, vous avez des suggestions sur la façon de résoudre ce problème. Peut-être pensez-vous qu'il existe un meilleur moyen d'exécuter ces fonctions manuelles?

EDIT: code de paramétrage complet: http://Pastebin.com/Gk5RF5Lc

1
Brady

Pourquoi l'API de paramètres envoie-t-elle ces paramètres lors de la soumission du formulaire de paramètres?

Franchement, ce n'est pas le cas. Comme vous l'avez déjà mentionné, votre formulaire simplement POST à ​​options.php, qui à son tour traite la demande, met à jour la base de données, puis redirige vers le référant .

Le mode de récupération du référent dépend de la fonction wp_get_referer();

function wp_get_referer() {
    $ref = '';
    if ( ! empty( $_REQUEST['_wp_http_referer'] ) )
        $ref = $_REQUEST['_wp_http_referer'];
    else if ( ! empty( $_SERVER['HTTP_REFERER'] ) )
        $ref = $_SERVER['HTTP_REFERER'];

    if ( $ref !== $_SERVER['REQUEST_URI'] )
        return $ref;
    return false;
}

C'est pourquoi vous êtes renvoyé à votre page d'options avec les paramètres d'action toujours présents - car ils étaient présents dans $_SERVER['HTTP_REFERER'].

Mais vous verrez également que vous pouvez remplacer ce comportement en plaçant une entrée masquée dans votre formulaire, comme ceci;

<input type="hidden" name="_wp_http_referer" value="<?php echo admin_url( 'options-general.php?page=wordpress-file-monitor-plus' ); ?>" />

Maintenant, options.php sera toujours redirigé vers ...

http://example.com/wp-admin/options-general.php?page=wordpress-file-monitor-plus

... indépendamment de ce qui était dans la chaîne de requête précédemment.

5
TheDeadMedic