web-dev-qa-db-fra.com

Préservation du paramètre $ _GET lors de l'utilisation de la règle de réécriture personnalisée

Ce plugin complémentaire tiers pour Gravity Forms vous permet de modifier les publications existantes via le serveur frontal lorsque vous incorporez un formulaire dans le modèle que vous avez choisi.

Tout ce que vous avez à faire est d’ajouter la variable/paramètre GET ?gform_post_id=1 à la fin de votre URL, qui contient le formulaire actuel. Il sera pré-rempli avec les données de publication existantes (à partir des champs de méta de publication, etc.), puis mis à jour la publication quand. vous le soumettez à nouveau.

Cela fonctionne uniquement lorsque vous utilisez un paramètre de style get associé à votre URL sous la forme de ?gform_post_id=1..., où 1 est l'ID de publication dans cet exemple.

Je ne veux pas d'URL laides, je veux de jolies URL, alors j'utilise les règles de réécriture suivantes pour ranger mes permaliens;

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

Ce qui prend ça,

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

... et permet cela à la place,

/user/account/edit/1

Mon query_vars est défini comme vous pouvez le voir dans un var_dump

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

Bien sûr, avec de jolis permaliens activés, la variable $_GET ne contient plus mon paramètre gform_post_id, ce qui signifie que même si ce qui suit indique la destination correcte, conformément à la règle de réécriture ci-dessus,

/user/account/edit/1   

... il ne pré-remplit pas mon formulaire avec les données de publication comme il le fait lorsque vous accédez à la même page directement via,

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

Des idées sur les moyens de contourner cela?

Remarques:

Le plugin lié à mon ouverture déclare la ligne suivante;

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

... pour extraire des données de la variable $ _REQUEST;

L'option request_id est associée à gform_post_id qui doit être défini comme paramètre de variable $_GET.

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

J'ai essayé de m'accrocher au filtre request et de définir la variable $_GET moi-même, mais en vain. Je pourrais être accroché tard dans la pièce, mais dans l'état actuel des choses, je ne sais pas trop comment résoudre ce problème sans modifier directement le plugin lui-même.

4
userabuser

La solution à mon problème était de décrocher finalement la fonction de construction sur init dans le plug-in, puis de rajouter la fonction de construction de plug-in sur le hook wp.

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

Cela signifie maintenant que je peux accéder à:

/user/account/edit/1  

... avec les données pré-remplies dans mon formulaire concernant l'identifiant de la publication dans ce cas 1.

Cependant, lors de la nouvelle soumission de ce formulaire, il crée un nouvel ID d'article au lieu de mettre à jour l'ID d'article d'origine 1, comme indiqué dans l'URL.

Par conséquent, dans ma situation, je l'ai fait;

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

... au lieu de supprimer l'action de construction d'origine dans le plug-in, je l'ai laissée en place et j'ai à nouveau déclaré l'action de construction sur le crochet wp qui garantissait que tous les crochets Gravity Form nécessaires se déclenchaient au bon endroit formulaire pour mettre à jour le même ID de message dans lequel je suis en train d’être modifié (indiqué dans l’URL).

Au-delà de cela, je ne pouvais pas être dérangé d'essayer de comprendre ce qui précisément dans le plug-in était à l'origine de cette mise à jour par rapport à la création d'un nouvel excentrique post-ID.

Pour quiconque essaie cela avec le module complémentaire Gravity Forms, comme indiqué dans mon OP, vous devez toujours définir votre variable $_GET ou $_REQUEST sur le hook d’action request, comme suit:

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

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

}
1
userabuser

Il existe une API pour votre cas d'utilisation: les noeuds finaux. Enregistrez un point de terminaison pour EP_PERMALINK et, lorsqu'il est défini, affichez votre formulaire.

2
fuxia