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?
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'] );