Lorsqu'un seul article est cliqué sur une page de catégorie ou d'ailleurs n'importe quelle page, vous pouvez obtenir l'URL de ce référent et l'analyser pour obtenir la chaîne de requête. Mais cela ne fonctionne qu'avec la structure de permalien par défaut
Exemple lorsque le référent est une page de catégorie:
A var_dump( parse_url( wp_get_referer() ) );
donne la sortie suivante avec la structure de permalien par défaut
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(11) "/wordpress/"
["query"]=>
string(5) "cat=7"
}
Avec la même chose var_dump()
avec des permaliens définis /%postname%/
, c'est ce que vous obtenez
array(3) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(32) "/wordpress/category/uit-my-lewe/"
}
Je peux utiliser le à path
partir du deuxième bloc de code avecget_category_by_path()
, je peux obtenir les objets de catégorie
Mon problème est de savoir comment procéder pour les termes de taxonomie.
J'ai fait un test. J'ai une taxonomie personnalisée event_cat
. Si je le réécris event-slug
, j'obtiens ce qui suit en path
utilisant /%postname%/
comme structure de permalien
/wordpress/event-slug/5-star/
et
event_cat=5-star
en utilisant la structure par défaut
Automatiquement, mon nom de taxonomie ne sera pas dans l'URL, juste le slug de mon terme. Donc, ce ne sera pas une méthode très sûre pour récupérer des objets du terme.
Ma question est, comment puis-je obtenir correctement la structure de permalien par défaut obtenir la chaîne de requête, ou la chaîne de requête ou la taxonomie et le nom du terme de la /%postname%/
structure de permalien
la source
Réponses:
Tout d'abord, je dois dire que ce
wp_get_referer()
n'est pas fiable à 100% car il repose sur ce$_SERVER['HTTP_REFERER']
qui n'est pas fiable à 100%, à partir de la documentation de php.net :Solution alternative
Si vous pouvez ajouter à l'URL de publication un argument de requête qui indique d'où vient la publication, elle sera plus fiable et vous n'aurez pas besoin de analyser une URL pour obtenir un objet terme.
Exemple:
Ce faisant, publier des permaliens cliqués sur une page de catégorie vous enverra une URL comme
Et vous pouvez facilement comprendre d'où vient l'utilisateur sans compter sur
$_SERVER['HTTP_REFERER']
et sans aucun autre effort.Répondez à votre question
Obtenir des informations sur les requêtes à partir d'une URL est quelque chose que WordPress fait dans le
WP::parse_request()
méthode.Cette méthode est destinée à être utilisée une seule fois et uniquement pour l'URL "principale" (l'URL qu'un utilisateur affiche) et non pour les URL arbitraires.
Il y a quelques mois, j'ai écrit le plugin Url To Query dans le but de faire la même chose pour les URL arbitraires.
Ce que j'ai fait était de le prendre
WP::parse_request()
, de le refactoriser en un code OOP plus sain et de le faire fonctionner avec des URL arbitraires (par exemple, l'URL à traiter est reçue en tant qu'arguments au lieu d'être extraite de$_SERVER
var).En utilisant mon plugin, vous pouvez
Ainsi, vous obtenez les arguments de requête (quelque chose que vous pouvez directement transmettre
new WP_Query
) à partir d'une URL, c'est exactement ce quiWP::parse_request()
fait.Dans votre cas, vous pouvez probablement vérifier le tableau args sans avoir besoin d'exécuter réellement une requête.
Cela peut certainement fonctionner, mais je pense que l'effort supplémentaire nécessaire pour analyser l'url et le manque de fiabilité de
$_SERVER['HTTP_REFERER']
rend la première solution meilleure pour vos étendues.la source
L'intention initiale de cette question était de savoir d'où un seul poste a été référé, puis d'après cela, de diffuser les messages suivants et précédents selon le référent.
Ce que je voulais accomplir était par exemple:
Un article est cliqué sur une page de catégorie, de taxonomie, de balise, de recherche ou d'archive d'auteur. Ces archives servent de référents. Maintenant, normalement, on utiliserait, comme dans ma question,
wp_get_referer()
pour obtenir ce référent et l'utiliser dans d'autres requêtes. Comme décrit par @GM dans sa réponse acceptée ci - dessus , cette méthode n'est pas fiable, alors je suis allé utiliser sa solution alternative .L'autre problème était d'avoir besoin d'utiliser une sorte de cookie ou de session pour stocker ce référent, de sorte que vous restituiez les publications du référent d'origine lorsque vous vous éloignez de la publication unique d'origine sur laquelle vous avez cliqué à partir de l'archive spécifique. Comme les cookies sont également contrôlés par l'utilisateur final et donc non fiables, et le fait que WordPress n'utilise pas de sessions par défaut, j'ai refactorisé les liens de publication suivants et précédents en utilisant @GM Alternative Solution pour avoir un moyen fiable de vérifier et de stocker mon original référent.
C'est ce que j'ai trouvé et j'espère que quelqu'un le trouvera utile dans un avenir proche. S'il vous plaît, utilisez et abusez du code pour répondre à vos besoins, une seule demande: laissez un lien vers cette question. :-)
NOTES SUR LE CODE À SUIVRE
Ce code est assez long et intensif, donc je ne vais pas entrer dans les détails. Le code a été bien commenté
Ce code a la possibilité de paginer entre les publications dans le même terme, tout comme la valeur par défaut
next_post_link()
etprevious_post_link()
fonctionne dans WordPress. Tout comme les fonctions natives, vous devez définir la taxonomie. La valeur par défaut dein_same_term
esttrue
et la taxonomie estcategory
Plus important encore, ce code nécessite PHP 5.4+
LE CODE
UTILISATION DANS DES MODÈLES UNIQUES
Si vous n'avez pas besoin de parcourir les articles dans le même terme, d'obtenir des articles de tous les types d'articles et de personnaliser le texte suivant et précédent avec votre lien, vous pouvez effectuer les opérations suivantes:
EDIT 1
À la demande d'un message sur SO, et dans le cadre d'un
@todo
, j'ai maintenant introduit la prise en charge non seulement pour naviguer entre les messages du type de message du message actuel, mais à partir d'un tableau de types de messages défini par l'utilisateur à l'aide de lapost_types
paramètre de la fonction. Veuillez voir le code mis à jour.EDIT 2
Ajoutez
'suppress_filters' => true,
auxWP_Query
arguments afin que la pagination ne soit pas modifiée par les filtres utilisés dansWP_Query
la source