Ottenere l'ID della categoria corrente dalla pagina dell'articolo WordPress
Ho un problema nell'ottenere l'ID della categoria dell'articolo corrente. Stiamo utilizzando <?php get_the_category( $id ) ?>
per trovare la categoria dell'articolo corrente.
Se un articolo come 'demo' ha 2 categorie come cat1 e cat2, quando apro una pagina cat1 e poi vado alla pagina demo, voglio un layout diverso... e quando apro una pagina cat2 e poi vado alla pagina demo, voglio aprire questa pagina demo con un altro layout. Questo può essere fatto solo quando riuscirò a identificare... da quale categoria proviene la chiamata... ma come??
WordPress ha una funzione wp_get_referer
, che ottiene l'URL di riferimento dall'header HTTP. Quindi, se si passa da un archivio di categoria a un singolo articolo, normalmente il nome della categoria sarà incluso in quell'URL. Questo significa che puoi iniziare il tuo single.php
in questo modo:
$refer = wp_get_referer();
if (strpos($refer, 'category/cat1') != false) {... fai qualcosa ...}
elseif (strpos($refer, 'category/cat2') != false) {... fai qualcos'altro ...}
else {... esegui un'azione predefinita ...}
A seconda della tua configurazione, questa soluzione potrebbe richiedere qualche modifica, ma l'idea generale dovrebbe essere chiara, spero.

<?php $categories = get_the_category( $post->ID ); ?>
Questo restituirà un array di categorie, da cui puoi ottenere l'id, in questo modo:
$categories[0]-> term_id;
Questo sarà per la prima categoria nell'array se ce n'è più di una.
Informazioni sull'utilizzo possono essere trovate nel codex

Grazie per questa informazione. Ma ho bisogno della categoria da cui il post è stato chiamato, piuttosto che la prima categoria.

Scusa, forse non ho capito bene, cosa intendi con 'da quale post è stato chiamato'?

Semplice-- c'è una pagina di categoria per cat-1 che mostra tutti i suoi post, ad esempio demo. Quando apro il post demo da questa pagina voglio che si apra con layout-1. E se apro il post demo dalla pagina della categoria cat-2, allora deve aprirsi con layout-2.

Posso farlo usando la query string ma preferirei evitare a causa di problemi con l'URL.

Suggerirei di impostare la categoria come post data utilizzando un form (anche se non sarebbe semantico) o javascript - anche se non funzionerà con javascript disabilitato, almeno si degraderebbe in modo elegante.
Potresti anche voler riformulare la tua domanda per riflettere meglio ciò che desideri - cambiare il layout di un post in base alla categoria da cui è stato visitato - così avrai maggiori probabilità di ottenere risposte.

Layout del post affinché un post appaia in questo formato (solo nell'aspetto) o in un altro formato.. Se uso javascript verrebbe comunque inserita una query string nell'URL.

L'unica altra cosa che mi viene in mente di suggerire è utilizzare variabili di sessione per salvare temporaneamente l'ultima pagina di categoria visitata, e poi se il post attualmente visualizzato è in quella categoria cambiare il layout.

Come menzionato da Gaffen: "cambiare il layout dei post in base alla categoria da cui è stato visitato"
Per prima cosa, nella pagina del template della categoria del tuo tema (es. category.php)
ottieni l'ID della categoria e memorizzalo nell'opzione Transient di WordPress.
global $wp_query;
//ottieni l'ID della categoria (o nome, slug) e memorizzalo nell'API transient
$categoryId = $wp_query->queried_object->cat_ID;
set_transient( 'category_id_visited', $categoryId, 1 * HOUR_IN_SECONDS );
ora su single.php o nella pagina del template di visualizzazione del singolo post.
recupera il valore da Transient e modifica la visualizzazione di conseguenza
if ( false === ( $category_id_visited = get_transient( 'category_id_visited' ) ) ) {
// questo codice viene eseguito quando non è impostato un transient valido
//non fare nulla per ora
} else {
echo 'Sei arrivato visitando la categoria: ' . $category_id_visited;
//elimina il transient se necessario, altrimenti scadrà automaticamente
delete_transient( 'category_id_visited' );
}
Spero sia d'aiuto.

Nel tuo single.php potresti usare ad esempio
if(has_category('layout-1')) {
// esegui qui le operazioni per la categoria layout-1
} elseif (has_category('layout-2')) {
// operazioni per layout-2 qui
} else {
// operazioni per tutti gli altri stili/contenuti regolari
}
Ancora meglio, usa get_template_part così non riempi il tuo single.php con ogni tipo di codice superfluo.

Per prima cosa ottieni l'ID della categoria:
$cat_id = get_queried_object_id();
Poi ottieni il nome della categoria:
$cat_name = get_cat_name($cat_id)
Quindi puoi decidere in base al nome della categoria cosa fare:
if ($cat_name == 'Cat 1') {
// ... url = layout-1
} elseif ($cat_name == 'Cat 2') {
// ... url = layout-2
}
