Cuando se hace clic en una sola publicación desde una página de categoría o en cualquier otra página, puede obtener la URL de ese referente y analizarla para obtener la cadena de consulta. Pero esto solo funciona con la estructura de enlace permanente predeterminada
Ejemplo cuando el referente es una página de categoría:
A var_dump( parse_url( wp_get_referer() ) );
da el siguiente resultado con la estructura de enlace permanente predeterminada
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(11) "/wordpress/"
["query"]=>
string(5) "cat=7"
}
Con lo mismo var_dump()
con los enlaces permanentes establecidos /%postname%/
, esto es lo que obtienes
array(3) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(32) "/wordpress/category/uit-my-lewe/"
}
Puedo usar path
desde el segundo bloque de código con get_category_by_path()
, puedo obtener los objetos de categoría
Mi problema es cómo hago esto para los términos de taxonomía.
He hecho una prueba. Tengo una taxonomía personalizada event_cat
. Si lo reescribo event-slug
, obtengo lo siguiente path
usando /%postname%/
como estructura de enlace permanente
/wordpress/event-slug/5-star/
y
event_cat=5-star
usando la estructura predeterminada
Automáticamente mi nombre de taxonomía no estará en la URL, solo la babosa de mi término. Por lo tanto, este no será un método muy seguro para obtener objetos del término.
Mi pregunta es, ¿cómo obtengo correctamente la estructura de enlace permanente predeterminada para obtener la cadena de consulta, o la cadena de consulta o la taxonomía y el nombre del término de la /%postname%/
estructura de enlace permanente
fuente
Respuestas:
En primer lugar, tengo que decir que
wp_get_referer()
no es 100% confiable porque se basa en$_SERVER['HTTP_REFERER']
que no es 100% confiable, de los documentos de php.net :Solución alternativa
Si puede agregar a la URL de publicación un argumento de consulta que indique de dónde proviene la publicación, será más confiable y no necesitará analizar una URL para obtener un objeto de término.
Ejemplo:
Al hacerlo, publicar enlaces permanentes en una página de categoría te enviará a una URL como
Y puede comprender fácilmente de dónde viene el usuario sin depender
$_SERVER['HTTP_REFERER']
y sin ningún otro esfuerzo.Responde tu pregunta
Obtener información de consulta a partir de una URL es algo que WordPress hace dentro del
WP::parse_request()
método.Ese método está destinado a ser utilizado solo una vez y solo para la url "principal" (la url que está viendo un usuario) y no para url arbitrarias.
Hace unos meses escribí el complemento Url To Query con el objetivo de hacer lo mismo para las URL arbitrarias.
Lo que hice fue tomar
WP::parse_request()
y refactorizarlo a un código OOP más sensato y hacerlo funcionar con URL arbitrarias (por ejemplo, la url para procesar se recibe como argumentos en lugar de tomarse de$_SERVER
var).Usando mi plugin puedes
Entonces obtienes los argumentos de consulta (algo a lo que puedes pasar directamente
new WP_Query
) a partir de una URL, eso es exactamente lo queWP::parse_request()
hace.En su caso, probablemente podría verificar la matriz de args sin necesidad de ejecutar una consulta.
Sin duda, esto puede funcionar, sin embargo, creo que el esfuerzo adicional necesario para analizar la URL y la falta de fiabilidad
$_SERVER['HTTP_REFERER']
hacen que la primera solución sea mejor para sus alcances.fuente
La intención original de esta pregunta era saber de dónde se refería una sola publicación y, de acuerdo con eso, servir las publicaciones siguientes y anteriores de acuerdo con el remitente de la publicación.
Lo que quería lograr era, por ejemplo:
Se hace clic en una publicación desde una categoría, taxonomía, etiqueta, búsqueda o página de archivo del autor. Estos archivos sirven como referentes. Ahora, normalmente se usaría, como en mi pregunta,
wp_get_referer()
para obtener ese referente y usarlo en consultas adicionales. Según lo descrito por @GM en su respuesta aceptada anteriormente , este método no es confiable, así que fui y usé su Solución alternativa .El otro problema fue la necesidad de utilizar algún tipo de cookie o sesión para almacenar este referente, de modo que aún pueda publicar publicaciones del referente original cuando navega fuera de la publicación única original en la que se hizo clic desde el archivo específico. Como las cookies también son controladas por el usuario final y, por lo tanto, no son confiables, y el hecho de que WordPress no usa sesiones de forma predeterminada, refactoré los enlaces de publicaciones siguientes y anteriores utilizando @GM Alternative Solution para tener una forma confiable de verificar y almacenar mi original referente.
Esto es lo que se me ocurrió, y espero que alguien lo encuentre útil en el futuro cercano. Utilice y abuse del código para satisfacer sus necesidades, solo una solicitud: deje un enlace a esta pregunta. :-)
NOTAS SOBRE EL CÓDIGO A SEGUIR
Este código es bastante largo e intenso, por lo que no voy a entrar en detalles. El código ha sido bien comentado
Este código tiene la opción de paginar entre publicaciones dentro del mismo término, al igual que el predeterminado
next_post_link()
yprevious_post_link()
funciona en WordPress. Al igual que las funciones nativas, debe establecer la taxonomía. El valor predeterminado parain_same_term
estrue
y la taxonomía escategory
Lo más importante, este código requiere PHP 5.4+
EL CÓDIGO
USO EN PLANTILLAS INDIVIDUALES
Si no necesita navegar por las publicaciones dentro del mismo término, obtener publicaciones de todos los tipos de publicaciones y personalizar el texto siguiente y anterior con su enlace, puede hacer lo siguiente:
EDITAR 1
A pedido de una publicación en SO, y como parte de una
@todo
, ahora he introducido soporte para navegar no solo entre las publicaciones del tipo de publicación de la publicación actual, sino también desde una matriz de tipos de publicaciones establecidas por el usuario usando elpost_types
parámetro en la función. Por favor vea el código actualizado.EDITAR 2
Agregue
'suppress_filters' => true,
a losWP_Query
argumentos para que la paginación no sea alterada por ningún filtro utilizado enWP_Query
fuente