使用自定义重写规则时保留$_GET参数

时间:2013-01-23 作者:Adam

third party add-on plugin for Gravity Forms允许您在所选模板中嵌入表单时,通过前端编辑现有帖子。

您只需附加GET变量/参数?gform_post_id=1 到包含当前表单的URL末尾,它将使用现有帖子数据(来自帖子元字段等)预填充表单,然后在重新提交帖子时更新帖子。

这仅在使用以以下形式附加到URL的get style参数时有效?gform_post_id=1... 哪里1 是本例中的post ID。

我不想要丑陋的URL,我想要漂亮的URL,所以我使用以下重写规则来整理我的永久链接;

function gform_rewrite(){

    global $wp_rewrite;

    add_rewrite_tag(\'%gform_post_id%\',\'([^&]+)\');

    add_rewrite_rule(
        \'^user/account/edit/([^/]*)/?\',
        \'index.php?page_id=183&gform_post_id=$matches[1]\',\'top\'
     );
}
这就需要这个,

/index.php?page_id=100&gform_post_id=1
。。。考虑到这一点,

/user/account/edit/1
我的query_vars 如您在var_dump

  ["query_vars"]=>
  array(56) {
    ["page_id"]=>
    int(100)
    ["gform_post_id"]=>
    string(3) "1"
    //....etc
当然,虽然有了漂亮的永久链接$_GET 变量不再保存gform_post_id 参数,这意味着尽管以下内容根据上述重写规则显示了正确的目标,

/user/account/edit/1   
。。。它不会像直接通过访问同一页面时那样使用post数据预先填充我的表单,

/index.php?page_id=100&gform_post_id=1
有什么想法吗?

注:

plugin 正如我在开场白中所链接的,声明了以下几行;

$this->get_post_object($_REQUEST[$this->options[\'request_id\']]);
。。。从$\\u请求变量中提取数据;

选项request_id 已映射到gform_post_id 应将其设置为$_GET 可变参数。

  public $options = array(
    \'request_id\' => \'gform_post_id\' // here we are...
    ,\'post_status\' => \'default\'
    ,\'capabilities\' => array(
      \'update\' => \'default\' 
      ,\'delete\' => \'disable\' 
    )
    ,\'entries\' => true
  );
我试着在request 筛选并设置$_GET 我自己变了,但没用。我可能会在文章的后面提到,但就目前而言,我有点不确定如何在不直接修改插件本身的情况下解决这个问题。

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

我的问题的解决方案是最终在插件的init上解开构造函数,然后在wp

 global $gform_update_post;
 remove_action( \'init\', array($gform_update_post, \'init\'), 100 );
 add_action( \'wp\', array($gform_update_post, \'init\'), 100 );
这意味着我现在可以访问:

/user/account/edit/1  
。。。在本例中,我的表单已成功预填充与帖子ID相关的数据1.

但是,当重新提交此表单时,它会创建一个新的帖子ID,而不是更新原始帖子ID1 如URL所示。

因此,在我的情况下,我做到了这一点;

 global $gform_update_post;
 add_action( \'wp\', array($gform_update_post, \'init\'), 100 );
。。。我没有删除插件中的原始构造操作,而是将其保留在原来的位置,而是在wp 钩子,确保所有必要的重力表单钩子都在正确的位置触发,以允许表单更新我正在编辑的相同帖子ID(如URL所示)。

除此之外,我不想费心去弄清楚插件中到底是什么导致了这个更新vs创建新的帖子ID怪癖。

如果其他人使用我的OP中列出的Gravity Forms附加组件进行此操作,您仍然需要设置$_GET$_REQUEST 上的变量request 动作钩,如:

add_filter( \'request\', \'alter_the_query\', 1 );

function alter_the_query( $request ) {
   $_REQUEST[\'gform_post_id\'] =  $request[\'gform_post_id\'];
       return $request;

}

SO网友:fuxia

有一个API正好适合您的用例:端点。Register an endpoint for EP_PERMALINK 设置后,显示您的表单。

结束

相关推荐