web-dev-qa-db-fra.com

Comment faire pour que _wpnonce et _wp_http_referer n'apparaissent pas dans l'URL

J'essaie de développer un plug-in comportant un champ de recherche et utilisant WP_List_Table. Le plug-in est strictement destiné au backend. Il recherche les utilisateurs de la base de données et les renvoie avec d'autres méta provenant d'un plug-in supplémentaire.

Lorsque je recherche l'utilisateur, les champs de saisie masqués de _wpnonce et _wp_http_referer sont ajoutés à la chaîne d'URL. La _wpnonce n'est pas un gros problème, mais le _wp_http_referer est un problème.

Si la personne qui utilise le plug-in continue à effectuer plusieurs recherches, la chaîne _wp_http_referer devient tellement longue dans l'URL qu'elle génère une erreur: Request-URI Trop grande La longueur de l'URL demandée dépasse la limite de capacité de ce serveur.

Alors, comment puis-je empêcher les valeurs masquées d'apparaître dans l'URL ou réinitialiser _wp_http_referer chaque fois que l'utilisateur clique sur le bouton de recherche?

2
Ken

Ce problème survient à cause de quelques problèmes:

1) WP_List_Table::search_box() insère les champs par défaut _wpnonce et _wp_http_referer en utilisant wp_nonce_field() sans vous donner la possibilité de remplacer et de dire "j'ai déjà passé un champ nonce, merci".

2) Vous devez utiliser GET comme méthode de soumission de formulaire lorsque vous sous-classez WP_List_Table car WP_List_Table::print_column_headers() ne vérifie que $_GET pour les paramètres orderby et order actuels et utilise $_SERVER['REQUEST_URI'] pour créer ses liens d’en-tête. Si vous n'utilisez pas GET comme méthode de formulaire, vous perdrez le paramètre de recherche lors du tri d'une colonne.

Il existe deux façons d'arrêter l'erreur Request-URI Too Large The requested URL's length exceeds the capacity limit for this server:

A) Étant donné que toutes les fonctions de non-vérification peuvent utiliser un champ de requête _wp_http_referer ou se replier sur l'en-tête approprié pour le référent, vous pouvez supprimer l'argument de requête _wp_http_referer au début du traitement.

Par conséquent, un moyen simple de résoudre ce problème consiste à ajouter les éléments suivants très tôt dans la fonction prepare_items() de votre sous-classe WP_List_Table.

$_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );

B) Le moyen probablement meilleur et plus sûr serait de basculer vers la méthode de soumission de formulaire POST et de mettre à jour $_SERVER['REQUEST_URI'] dans prepare_items() avec tous les paramètres qui vous intéressent une fois que vous les avez compilés pour que WP_List_Table::print_column_headers() fonctionne comme prévu.

$options = array(
    'blog_id'     => $blog_id,
    's'           => $search,
    'record_type' => $record_type,
    'orderby'     => $orderby,
    'order'       => $order,
);

// Update the current URI with the new options.
$_SERVER['REQUEST_URI'] = add_query_arg( $options, $_SERVER['REQUEST_URI'] );
3
ianmjones