Obtener el ID de categoría actual desde la página de entrada en WordPress
Tengo un problema para obtener el ID de categoría de la entrada actual. Estamos usando <?php get_the_category( $id ) ?>
para encontrar la categoría de la entrada actual.
Si una entrada como 'demo' tiene 2 categorías como cat1 y cat2. Cuando abro una página de cat1 y luego voy a la página demo, quiero un diseño diferente... y cuando abro una página de cat2 y luego voy a la página demo, quiero abrir esta página demo con otro diseño. Esto solo se puede hacer cuando pueda identificar... desde qué categoría se ha llamado... pero ¿cómo?

WordPress tiene una función wp_get_referer
, que obtiene la URL de referencia desde la cabecera HTTP. Así que, si navegas desde un archivo de categoría a una entrada individual, el nombre de la categoría normalmente estará incluido en esa URL. Esto significa que puedes comenzar tu single.php
de esta manera:
$refer = wp_get_referer();
if (strpos($refer, 'category/cat1') != false) {... hacer algo ...}
elseif (strpos($refer, 'category/cat2') != false) {... hacer otra cosa ...}
else {... acción por defecto ...}
Dependiendo de tu configuración, esta solución puede necesitar algunos ajustes, pero la idea general es clara, espero.

<?php $categories = get_the_category( $post->ID ); ?>
Esto devolverá un array de categorías, del cual puedes obtener el ID, así:
$categories[0]-> term_id;
Esto será para la primera categoría en el array si hay más de una.
Puedes encontrar información sobre su uso en el codex

Gracias por esta información. Pero necesito una categoría desde la cual se haya llamado la publicación en lugar de la primera categoría.

Disculpa, quizás no entendí bien, ¿qué quieres decir con 'desde qué publicación se ha llamado'?

Sencillamente-- hay una página de categoría para cat-1 y muestra todas sus publicaciones, ej. demo. Cuando abro demo desde esta página, quiero que la publicación demo se abra en layout-1. Y si abro la publicación demo desde la página de categoría cat-2, entonces debe abrirse con layout-2.

Puedo hacer esto usando cadenas de consulta pero no quiero usarlo debido a problemas con la URL.

Sugeriría establecer la categoría como datos de publicación usando un formulario (aunque no es semántico) o javascript, aunque eso no funcionará sin javascript, al menos se degradará correctamente.
También podrías reformular tu pregunta para reflejar mejor lo que quieres: cambiar el diseño de una publicación dependiendo de la categoría desde la que se visitó, ya que así es más probable que obtengas respuestas.

Diseño de publicación donde una publicación se vea en este formato (solo apariencia) u otro formato... Si uso javascript también coloca cadenas de consulta en la URL.

Lo único que se me ocurre sugerir es usar variables de sesión para guardar temporalmente la última página de categoría visitada, y luego si la publicación actualmente vista está en esa categoría, cambiar el diseño.

Como mencionó Gaffen: "cambiar el diseño de una publicación dependiendo de la categoría desde la cual fue visitada"
Primero, en la plantilla de categoría de tu tema (por ejemplo, category.php)
Obtén el ID de la categoría y guárdalo en la opción Transient de WordPress.
global $wp_query;
//obtener el ID de la categoría (o nombre, slug) y guardarlo en la API Transient
$categoryId = $wp_query->queried_object->cat_ID;
set_transient( 'category_id_visited', $categoryId, 1 * HOUR_IN_SECONDS );
Ahora en single.php o la plantilla de visualización de publicación individual.
Obtén el valor de Transient y cambia la visualización según corresponda
if ( false === ( $category_id_visited = get_transient( 'category_id_visited' ) ) ) {
// este código se ejecuta cuando no hay un transient válido configurado
// no hacer nada por ahora
} else {
echo 'Viniste al visitar la categoría: ' . $category_id_visited;
//eliminar el transient si es necesario, de lo contrario expirará automáticamente
delete_transient( 'category_id_visited' );
}
Espero que ayude.

En tu archivo single.php podrías usar por ejemplo:
if(has_category('layout-1')) {
// hacer aquí lo correspondiente a layout-1
} elseif (has_category('layout-2')) {
// acciones para layout-2 aquí
} else {
// acciones para todos los demás estilos/contenido normal
}
Mejor aún, usa get_template_part para no saturar tu single.php con todo tipo de código innecesario.

Primero obtén el ID de la categoría:
$cat_id = get_queried_object_id();
Luego obtén el nombre de la categoría:
$cat_name = get_cat_name($cat_id)
Entonces puedes decidir dependiendo del nombre de la categoría qué hacer:
if ($cat_name == 'Cat 1') {
// ... url = layout-1
} elseif ($cat_name == 'Cat 2') {
// ... url = layout-2
}
