Quel est le flux approprié pour les données personnalisées de l'URL dans WP_Query?

14

J'ai un processus en plusieurs étapes qui intègre des facettes complexes dans les requêtes WP. Le problème est - plus je deviens profond, plus je deviens flou sur la façon dont il est censé fonctionner et je pourrais utiliser une ligne directrice plutôt que d'être inventif (et de me creuser un trou).

Étapes générales que j'ai (pseudo-code, mais proche du réel):

  1. récupérer la valeur de l'URL (quelque chose de simple comme person=1)
  2. traiter la valeur et ajouter des instructions de requête personnalisées ( $relationship_query[] = array('relationship' => 'person_to_cat', 'object' => 1 );)
  3. récupérer les instructions de requête personnalisées finales et générer les directives SQL appropriées

À l'heure actuelle, j'en ai beaucoup (relations, taxonomies, dates) et cela devient fragile (un coin de code ne met pas de valeur là où l'autre coin de code s'attend à ce qu'il trouve et tout se détache).

La grande question est donc: quel est le protocole approprié pour transmettre, recevoir, stocker et traiter des données personnalisées vers WP via URL ?

Pièces plus petites:

  • comment m'assurer de ne pas entrer en collision avec des internes WP?
  • où et comment je stocke les données intermédiaires?
    • différence entre queryet query_varspropriétés? Ils semblent être utilisés presque de la même manière dans le code, mais ils ont tendance à avoir des valeurs et des méthodes différentes en faveur d' query_varsun.
Rarst
la source

Réponses:

6

Je pense que la fonction WP que vous recherchez est add_rewrite_tag . Il vise à ajouter des paramètres GET personnalisés à votre URL et à les inclure automatiquement dans query_vars.

Par exemple, vous pouvez ajouter ce qui suit au crochet init:

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

Pour une URL telle que http://example.com?person=joe , le global $wp_queryaura

$wp_query->query_vars['person'] = 'joe'

Vous pouvez également ajouter une règle de réécriture pour rendre l'URL plus jolie, par exemple http://example.com/person/joe

add_rewrite_rule('^person/([^/]*)/?','index.php?person=$matches[1]','top');

Voir l' API de réécriture pour plus d'informations et d'exemples.

Fabien Quatravaux
la source
2
J'ai trouvé du temps (enfin) pour lire tout le code pertinent dans WPet WP_Queryet bien qu'il y ait beaucoup de choses qui s'y passent, je pense que cela add_rewrite_tag()semble le plus succinct pour sensibiliser WP à la var de requête personnalisée et bien jouer avec.
Rarst
1
  1. Consultez wp-includes / class-wp.php pour vérifier toutes les variables de requête réservées
  2. Je ne sais pas ce que vous entendez par données intermédiaires. Pouvez-vous expliquer plus?
  3. WP charge la page en fonction d'une chaîne de requête sur l'URL qui est traduite en requête, ils sont ensuite traités par WP_Query pour déterminer quelle variable de requête est utilisée.

Exemple: en chargeant une page avec /? Nom de page = about, WP traitera la chaîne de requête et trouvera que la variable de requête utilisée est page_id.

Un autre exemple: /? Cat = 1, /? Category_name = uncategorized et / category / uncategorized ont la même variable de requête "cat"

AriePutranto
la source
0

J'aurais supposé que cela se faisait via $_GETet / ou $_POST, puis je manipulais en conséquence.

Alternativement, stockez l'énorme tas de données dans la base de données, puis analysez un identifiant dans l'URL comme ceci

$data_id = $_GET['id'];

$data = $wpbd->get_results("SELECT * FROM wp_epic_table WHERE id=".$id);

La requête ne sera évidemment pas aussi simple, elle peut impliquer beaucoup de jointures et de tables de jointures. C'est ce que je fais dans l'une de mes pages, analyser un identifiant unique puis créer les données via MySQL.

Joshua
la source