如何在使用WP_LIST_TABLE时从URL中删除_wp_http_referer?

时间:2013-01-11 作者:Vincent

我构建了一个插件,它使用WP\\u List\\u table类显示一个表。该表显示可以应用筛选器和一些批量操作的条目。

问题是,当我多次单击“筛选”按钮或“应用批量操作”按钮时,会将\\u wp\\u http\\u referer参数添加到URL中,并且每次单击该按钮时,该参数都会越来越长。

最终,URL很长,我在浏览器中看到一个空白页面,并显示以下错误消息:

Request-URI Too Large
The requested URL\'s length exceeds the capacity limit for this server.
我想我已经在一个简单的表单标签中正确设置了过滤器和批量操作选择菜单:

form action method="get"
这里似乎也描述了同样的问题:How to stop _wpnonce and _wp_http_referer from appearing in URL. 我也面临同样的问题,想知道是否有人知道在单击我的表单操作按钮后如何从URL中删除\\u wp\\u http\\u referer参数。

谢谢

6 个回复
最合适的回答,由SO网友:diggy 整理而成

正如该Q上的最后一位评论员所建议的,您可能应该检查操作,删除查询参数并重定向。类似于:

$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;
} 

SO网友:Daniel Antunes

让我来帮你!覆盖WP\\u List\\u Table类的父方法display\\u tablenav,删除WP\\u nonce\\u字段执行。

/**
 * 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
}

SO网友:Sijo Thomas Maprayil

在页脚或任何常见的js中提供以下脚本

setTimeout(function(){jQuery(“input[name*=\'\\u wp\\u http\\u referer\']))。remove();},500);

SO网友:Mark

接受的答案是最好的方式,但如果列表出现在自定义管理页面上,您将遇到已发送的标题错误。

我能想到的最好方法是检测嵌套_wp_http_referer 在…上admin_init 然后在那里重定向。

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;

}
请注意代码的计时。如果在此挂钩之后处理列表表操作(例如,在列表表类中),则在执行操作之前存在重定向风险,因此将被忽略,需要第二次请求。请确保在您自己的实现中适当地处理这一问题。

您可以考虑使用load-{page-hook} action来处理操作,其中{page hook}是从add_submenu_page (或类似)呼叫。

SO网友:Shikyo

我知道这是一个老生常谈的问题,但我选择了西乔·托马斯·马普雷伊(SijoThomasMaprayil)的《awnser》的修改版

jQuery("input[name=\'_wp_http_referer\'], input[name=\'_wpnonce\']").remove();
只要在搜索框下方执行脚本,就不需要超时。

我想知道,如果wordpress再次重定向以删除这些字段,为什么还要添加这些字段。至少可以说是次优的。

SO网友:IAmJulianAcosta

下面是实现此技巧的代码:

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);
    }
}

结束

相关推荐