Preservando o parâmetro $ _GET ao usar a Regra de Regravação personalizada

4

Este plug-in complementar de terceiros para Gravity Forms permite que você edite postagens existentes através do front end quando você incorpora um formulário no modelo escolhido.

Tudo o que você precisa fazer é anexar a variável / parâmetro GET ?gform_post_id=1 ao final do seu URL que contém o formulário atual e preencher o formulário com os dados de postagem existentes (a partir dos campos meta meta, etc.) e em seguida, atualize a postagem quando você a enviar novamente.

Isso funciona somente ao usar um parâmetro de estilo get anexado ao seu URL na forma de ?gform_post_id=1 ... onde 1 é o ID da postagem neste exemplo.

Eu não quero URLs feias, quero URLs bonitas, então estou usando as seguintes regras de reescrita para organizar meus permalinks;

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

O que leva isso,

/index.php?page_id=100&gform_post_id=1

... e permite isso,

/user/account/edit/1

Meus query_vars estão definidos como você pode ver em var_dump

  ["query_vars"]=>
  array(56) {
    ["page_id"]=>
    int(100)
    ["gform_post_id"]=>
    string(3) "1"
    //....etc

É claro que com os permalinks ativos ativados, a variável $_GET não detém mais o parâmetro gform_post_id , o que significa que, embora o seguinte mostre o destino correto de acordo com a regra de reescrita acima,

/user/account/edit/1   

... não preenche meu formulário com dados de postagem como acontece quando acessa a mesma página diretamente por meio de

/index.php?page_id=100&gform_post_id=1

Quaisquer pensamentos sobre formas de contornar isso?

Notas:

O plug-in como vinculado na minha abertura declara a seguinte linha:

$this->get_post_object($_REQUEST[$this->options['request_id']]);

... para extrair dados da variável $ _REQUEST;

A opção request_id é mapeada para gform_post_id , que deve ser definida como o parâmetro da variável $_GET .

  public $options = array(
    'request_id' => 'gform_post_id' // here we are...
    ,'post_status' => 'default'
    ,'capabilities' => array(
      'update' => 'default' 
      ,'delete' => 'disable' 
    )
    ,'entries' => true
  );

Eu tentei ligar o filtro request e definir a variável $_GET , mas sem sucesso. Eu poderia estar ligando para o final da peça, mas como está, estou um pouco inseguro de como resolver este problema sem modificar diretamente o plugin em si.

    
por userabuser 23.01.2013 / 11:26

2 respostas

1

A solução para o meu problema foi, finalmente, desligar a função de construção no init dentro do plug-in e, em seguida, adicionar novamente a função de construção do plug-in no wp hook.

 global $gform_update_post;
 remove_action( 'init', array($gform_update_post, 'init'), 100 );
 add_action( 'wp', array($gform_update_post, 'init'), 100 );

Isso agora significa que posso acessar:

/user/account/edit/1  

... com sucesso com o meu formulário preenchendo previamente dados pertencentes ao ID do post, neste caso 1 .

No entanto, ao reenviar esse formulário, ele cria um novo ID de postagem em vez de atualizar o ID de postagem original 1 , conforme mostrado no URL.

Portanto, na minha situação, fiz isso;

 global $gform_update_post;
 add_action( 'wp', array($gform_update_post, 'init'), 100 );

... em vez de remover a ação de construção original dentro do plug-in, deixei-a no lugar e, em vez disso, declarei novamente a ação de construção no gancho wp , o que garantiu que todos os ganchos de Gravity Form necessários estivessem sendo disparados. lugar certo para permitir que o formulário atualize o mesmo ID de postagem no qual estou editando (mostrado em URL).

Além disso, não poderia ser incomodado tentando descobrir o que especificamente dentro do plug-in estava causando essa atualização, além de criar uma nova peculiaridade de ID do post.

Para qualquer outra pessoa que tente isso com o complemento Gravity Forms, conforme listado no meu OP, você ainda precisa definir sua variável $_GET ou $_REQUEST no gancho de ação request , da seguinte forma:

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

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

}
    
por userabuser 25.01.2013 / 16:11
2

Existe uma API para exatamente o seu caso de uso: endpoints. Registre um endpoint para EP_PERMALINK e quando estiver definido, exiba seu endpoint forma.

    
por fuxia 23.01.2013 / 12:05