¿Cómo eliminar _wp_http_referer de la URL cuando se usa WP_List_table?

2

He creado un complemento que muestra una tabla usando la clase WP_List_Table. La tabla muestra las entradas en las que es posible aplicar un filtro y algunas acciones masivas.

El problema es que cuando hago clic en el botón "filtro" o en el botón "aplicar acción masiva" varias veces, el parámetro _wp_http_referer se agrega a la URL y sigue siendo más y más largo cada vez que hago clic en el botón.

Finalmente, la URL es tan larga que aparece una página en blanco en el navegador con el siguiente mensaje de error:

Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.

Creo que he configurado el filtro y los menús de selección de acciones masivas correctamente dentro de una etiqueta de formulario simple:

form action method="get"

El mismo problema parece haber sido descrito aquí: Cómo detener _wpnonce y _wp_http_referer De aparecer en la URL . Me enfrento al mismo problema y me pregunto si alguien tendría alguna idea de cómo eliminar el parámetro _wp_http_referer de la URL después de hacer clic en los botones de acción del formulario.

Gracias

    
pregunta Vincent 11.01.2013 - 01:16

6 respuestas

4

Como sugirió el último comentarista en esa Q, probablemente debería verificar las acciones, eliminar los argumentos de consulta y redirigir. Algo como:

$doaction = $wp_list_table->current_action();
if ( $doaction && isset( $_REQUEST['SOMEVAR'] ) ) {
    // do stuff
} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
    wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), stripslashes( $_SERVER['REQUEST_URI'] ) ) );
    exit;
} 
    
respondido por el diggy 11.01.2013 - 01:24
1

Déjame ayudarte! Sobrescriba el método principal display_tablenav de la clase WP_List_Table eliminando la ejecución de wp_nonce_field.

/**
 * Generates the table navigation above or bellow the table and removes the
 * _wp_http_referrer and _wpnonce because it generates a error about URL too large
 * 
 * @param string $which 
 * @return void
 */
function display_tablenav( $which ) 
{
    ?>
    <div class="tablenav <?php echo esc_attr( $which ); ?>">

        <div class="alignleft actions">
            <?php $this->bulk_actions(); ?>
        </div>
        <?php
        $this->extra_tablenav( $which );
        $this->pagination( $which );
        ?>
        <br class="clear" />
    </div>
    <?php
}
    
respondido por el Daniel Antunes 20.06.2013 - 15:23
1

Proporcione la siguiente secuencia de comandos en pie de página o en cualquier js común

     setTimeout (function () {       jQuery ("input [name * = '_ wp_http_referer']") .remove ();      }, 500);     
respondido por el Sijo Thomas Maprayil 06.01.2016 - 10:32
1

La respuesta aceptada es la mejor manera de hacerlo, pero si la Tabla de lista aparece en una página de administración personalizada, se encontrará con los encabezados que ya han enviado errores.

Lo mejor que puedo hacer es detectar un _wp_http_referer anidado en admin_init y hacer la redirección allí.

add_action( 'admin_init', 'wpse_80112' );

function wpse_80112() {

    // If we're on an admin page with the referer passed in the QS, prevent it nesting and becoming too long.
    global $pagenow;

        if( 'admin.php' === $pagenow && isset( $_GET['_wp_http_referer'] ) && preg_match( '/_wp_http_referer/', $_GET['_wp_http_referer'] ) ) :
            wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
            exit;
        endif;

}

Tenga en cuenta la sincronización de su código. Si maneja las acciones de la tabla de la lista después de este enganche (por ejemplo, dentro de la clase de la tabla de la lista), existe un riesgo de redireccionamiento antes de que se ejecute la acción; por lo tanto, se ignorará y necesitará una segunda solicitud. Asegúrese de manejar esto en su propia implementación, según corresponda.

Puedes considerar usar la acción load-{page-hook} para manejar las acciones, donde {page-hook} es el retorno de tu llamada add_submenu_page (o similar).

    
respondido por el Mark 25.08.2017 - 21:20
0

Aquí está el código que hace el truco:

public function strip_wp_http_referrer () {
    $current_url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    if (strpos($current_url, '_wp_http_referer') !== false) {
        $new_url = remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), stripslashes($current_url));
        wp_redirect ($new_url);
    }
}
    
respondido por el IAmJulianAcosta 24.03.2014 - 23:41
0

Sé que esta es una pregunta antigua, pero me conformé con una versión modificada del awnser de Sijo Thomas Maprayil

jQuery("input[name='_wp_http_referer'], input[name='_wpnonce']").remove();

No es necesario un tiempo de espera mientras el script se ejecute debajo del cuadro de búsqueda.

Me pregunto por qué estos campos se agregan incluso si wordpress redirecciona y se deshace de ellos nuevamente. Muy óptimo para decir lo menos.

    
respondido por el Shikyo 08.08.2018 - 16:39

Lea otras preguntas en las etiquetas