Domanda

( del moderatore Nota: Il titolo originale era "utilizzando archivio per data con una data personalizzato")

Sto aggiungendo una data ulteriore per i post come un campo personalizzato. Ora voglio l'archivio per mostrare i messaggi di data personalizzato e non per la data pubblicato. Per esempio Ho un post pubblicato oggi (22 dicembre) , ma la data personalizzato è impostato su 1 ° gennaio . Quando carico il archives/date/2011/01 URL nel browser i post con la data personalizzata che partita non vengono visualizzati (ovviamente).

C'è un modo per modificare il comportamento della pagina generata per l'URL archives/date/2011/01 per retrive i posti entro la data personalizzato?

Grazie.

È stato utile?

Soluzione

Come per molte cose in WordPress ci sono diversi modi per fare ciò che si vuole. Io vado a spiegare uno di loro.

Rimuovere la 'year', 'monthnum' e 'day' variabili di query

È possibile modificare i parametri per gli usi di query WordPress sulle URL dell'archivio all'interno del gancio 'pre_get_posts'. Tali parametri vengono acquisite come un array associativo dalle regole di riscrittura nella proprietà dell'oggetto WP_Query chiamato variabili query_vars 'year', 'monthnum' e 'day'.

Quando $wp_query->query_vars ha valori per 'year', 'monthnum' e 'day' li utilizzerà WordPress quando interrogare l'elenco dei messaggi in modo il primo passaggio è quello di rimuovere quelle coppie chiave-valore dalla matrice di query utilizzando funzione unset() PHP (si noti che $wp_query è una variabile globale in WordPress che contiene l'oggetto query corrente come un'istanza della classe WP_Query.)

La funzione yoursite_pre_get_posts() sotto innescata dal gancio 'pre_get_posts' rimuoverà quelle variabili dalla matrice query_vars ma solo quando la query è la query principale * (cioè il $query passato al gancio è esattamente uguale al $wp_the_query globale o $query===$wp_the_query) e solo quando la query è un archivio query. Se si aggiunge questo al file di functions.php del vostro tema troverete i vostri pagine di archivio visualizzare tutti i messaggi, non solo quelli per la data (quindi siamo a metà strada a ciò che si vuole ...) :

add_action('pre_get_posts', 'yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    unset($query->query_vars['year']);
    unset($query->query_vars['monthnum']);
    unset($query->query_vars['day']);
  }
}

Aggiungi variabili di query per il campo personalizzato

Ora è qui che diventa un po 'difficile. In v3.0.x WordPress si permette solo di query per campo personalizzato utilizzando i valori nella matrice query_var e non permette di applicare le funzioni di tali criteri sia.

Il seguente modifica al yoursite_pre_get_posts() permetterebbe la query archivio per abbinare una data precisa supponendo che memorizzato la data in formato 'YYYY-MM-DD' nel campo personalizzato:

add_action('pre_get_posts', 'yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $qv = &$query->query_vars;
    $date = mktime(0,0,0,$qv['monthnum'],$qv['day'],$qv['year']);
    $qv['meta_key'] = 'Custom Date';
    $qv['meta_value'] = date("Y-m-d",$date);
    unset($qv['year']);
    unset($qv['monthnum']);
    unset($qv['day']);
  }
}

Ed ecco cosa che assomiglia a uno screenshot:

Certo che è si vuole veramente che si desidera. Si desidera eseguire una query per l'anno e il mese invece di appena il giorno specifico, o anche solo per l'anno. Come ho detto prima, questo è dove ottiene ingannevole.

utilizzare il gancio 'posts_where' per modificare la clausola SQL WHERE

Fondamentalmente è necessario approfondire i ganci ed e chiamare il gancio 'posts_where', che ho sempre cercare di evitare, se possibile, dal momento che quando si sta facendo trovare testo e sostituirlo su frammenti di query SQL è molto facile scrivere il codice che sarà incompatibile con un altro plugin che modifica la stessa query SQL. Tuttavia, se ne avete bisogno e nient'altro funzionerà allora è lì per voi come ultima risorsa.

Quindi, le ricerche di funzione yoursite_posts_where() la clausola WHERE che WordPress costruisce per il "AND wp_postmeta.meta_value = '2011-01'" testo e lo sostituisce con il "AND SUBSTRING(wp_postmeta.meta_value,1,7) = '2011-01'" di testo, ed ecco il codice:

add_action('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where( $where, $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $meta_value = $query->query_vars['meta_value'];
    $length = strlen($meta_value);
    $find = "AND wp_postmeta.meta_value = '{$meta_value}'";
    $replace = "AND SUBSTR(wp_postmeta.meta_value,1,{$length}) = '{$meta_value}'";
    $where = str_replace($find,$replace,$where);
  }
  return $where;
}

Modifica yoursite_pre_get_posts() per supportare più anno-mese-giorno Opzioni

Certo che richiederà modifichiamo la nostra funzione yoursite_pre_get_posts() per supportare diversi valori di lunghezza meta: 'YYYY', 'YYYY-MM' e 'YYYY-MM-DD' (si noti l'uso di quello che sembra essere l'uso complesso di funzioni mktime() e date() di PHP sono semplicemente per evitare di dover preoccuparsi di questi modelli: 'YYYY-M', 'YYYY-MM-D' e 'YYYY-M-D'):

add_action('pre_get_posts','yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $qv = &$query->query_vars;  // Make it less tedious to reference
    if ($qv['monthnum']==0) // Just search on YYYY
      $date = $qv['year'];
    else if ($qv['day']==0) // Search on YYYY-MM
      $date = date('Y-m',mktime(0,0,0,$qv['monthnum'],1,$qv['year']));
    else
      $date = date('Y-m-d',mktime(0,0,0,$qv['monthnum'],$qv['day'],$qv['year']));
    $qv['meta_key'] = 'Custom Date';
    $qv['meta_value'] = $date;
    unset($qv['year']);
    unset($qv['monthnum']);
    unset($qv['day']);
  }
}

E questo ci dà il following che avvolge più o meno a ciò che stavate cercando:

Codice per visualizzare la data personalizzato in tema

A proposito, ecco il codice che ho usato nel tema per afferrare il valore di date personalizzato meta:

<?php if ($custom_date = get_post_meta($post->ID,'Custom Date',true)): ?>
  <h2>Custom Date: <?php echo $custom_date; ?></h2>
<?php endif; ?>

P.S. Ricordate l'utente deve inserire in formato 'YYYY-MM-DD'

Ricordate le esigenze degli utenti per inserire la data personalizzati nel formato 'YYYY-MM-DD' per questo al lavoro. Naturalmente si può rendere più amichevole per l'utente attraverso diversi metodi, vale a dire nel codice SQL o tramite un gancio 'save_post' che riformatta la data, ma lascio che come un esercizio per qualcun altro.

P.P.S. Opzione: salvare più valori Meta Invece

Un altro approccio sarebbe stata quella di utilizzare il gancio 'save_post' per salvare tre (3) i valori metadati nascosti nel formato giusto per corrispondenza per 'YYYY-MM-DD', 'YYYY-MM' e 'YYYY' magari con la meta chiavi '_custom_date', '_custom_date_year_month' '_custom_date_year' che sarebbe più resistente ad altri plugin che potrebbe anche voler modificare la clausola di SQL WHERE ma sarebbe aggiungere tre (3) ulteriori campi personalizzati nascosti per ogni post in modo che potrebbe non essere una buona idea per un blog con un gran numero di posti ed è possibile che potevano uscire sincrono in qualche modo.

Altri suggerimenti

Prova questo:

PS HM, penso che gli archivi di data sono di solito come /year/month/, che cosa stai usando per ottenere /archives/date/year/month/? ..

PPS in realtà dopo guardando risposta di Mike questo non è probabilmente sufficiente per influenzare la selezione dei messaggi. Scratch questo.

Sì - dovrai sia per uso query_posts() o get_posts() o scrivere una query personalizzata da soli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top