Domanda

Ho cercato di impostare un modo per scrivere i messaggi in una serie sul mio sito. L'idea è che ogni post può appartenere a una serie diversa in una tassonomia personalizzato. Ho ottenuto quasi impostare tutto il modo in cui lo voglio ... con una sola eccezione.

Registrazione della Tassonomia

Questa parte funziona. Ho lasciato cadere il seguente codice in un plug-in:

function jdm_build_series_taxonomy() {
    $labels = array(
        'name' => _x('Series Labels', 'taxonomy general name'),
        'singular_name' => _x('Series Label', 'taxonomy singular name'),
        'search_items' => __('Search Series Labels'),
        'popular_items' => __('Popular Series Labels'),
        'all_items' => __('All Series Labels'),
        'parent_item' => __('Parent Series Label'),
        'parent_item_colon' => __('Parent Series Label:'),
        'edit_item' => __('Edit Series Label'),
        'update_item' => __('Update Series Label'),
        'add_new_item' => __('Add New Series Label'),
        'new_item_name' => __('New Series Label Name')
    );

    register_taxonomy(
        'series',
        'post',
        array(
            'hierarchical' => true,
            'label' => __('Series'),
            'labels' => $labels,
            'query_var' => true,
            'rewrite' => true
        )
    );
}

add_action( 'init', 'jdm_build_series_taxonomy', 0 );

Questo aggiunge "Etichette Series" per i messaggi Menu a discesa e mi dà una scatola di "Serie etichette" nella schermata di posta di modifica. di lavoro di tutto, e possono contrassegnare i messaggi come parte di una serie perfettamente. Il problema sta nel prossimo paragrafo ...

Elenco articoli nella tassonomia

Il mio obiettivo è quello di permettere ai lettori di camminare attraverso una serie un post alla volta, a cominciare con il post più antica e lo spostamento in avanti cronologicamente. Questo è diverso da una tipica pagina di archivio, perché ho 10 messaggi per pagina per i miei archivi, ma ovviamente voglio un solo post per pagina per l'archiviazione miei serie.

Ho creato un file taxonomy-series.php dentro il mio modello. Ed è metà funziona. La prima pagina funzionerà bene - http://localhost/wp/series/my-test-series/ visualizza il primo articolo della serie con il link "Next Entry»" nella parte inferiore della pagina. Fin qui, tutto bene ...

Ma quando si fa clic su "Next Entry»" e andare alla pagina successiva (http://localhost/wp/series/my-test-series/page/2/) è a) l'articolo e b sbagliato) il modello sbagliato!

Tuttavia, se ho impostato "pagine sul blog mostrare al massimo:" a "1" nella pagina di lettura (è normalmente impostato su 10) allora le cose funzionano bene. Pagina 2 visualizza il secondo articolo, pagina 3 visualizza il terzo, ecc.

Quindi ... che cosa ho bisogno per doppio controllo per forzare la pagina di archivio tassonomia per visualizzare un solo post su ogni pagina? Ho provato quanto segue:

$new_query = wp_parse_args(
    $query_string, 
    array(
        'posts_per_page' => 1,
        'paged' => $paged
    )
);

query_posts($new_query);

e

query_posts($query_string.'&posts_per_page=1&paged='.$paged);

senza alcun risultato ... idee? Suggerimenti? Suggerimenti?

È stato utile?

Soluzione

Ciao @EAMann :

I rabbrividire ogni volta che ho bisogno di fare qualcosa di creativo con gli URL in WordPress come il sistema di URL è a mio parere di gran lunga l'aspetto più poco elegante di WordPress. Mi sento sempre come sto dover combattere WordPress per arrivare a fare quello che voglio, e che WordPress è attivamente combattendo Me Back imparentato con gli URL. Quindi, con questo apri ...

Pensare attraverso il vostro problema ho intenzione di dare un suggerimento che non è esattamente quello che hai chiesto. Se non lo trovate a essere quello che state cercando che va bene solo per favore non chiunque down-voto perché sto solo cercando di aiutare.

tassonomia non è singolo di incremento e non ha alcuna Meta

Uno dei problemi con ciò che si sta cercando di fare è il sistema di tassonomia non si un singolo incremento ordinamento e non ha meta . Ad esempio in un 3 serie pubblicare si potrebbe trovare patti con IDs di 373, 411 e 492; si può capire che 373 = #1, 411 = #2 e 492 = #3 ma questo è tutto casualità e l'uno rispetto all'altro. E 'come cercare di posizione alla radice del vostro sito WordPress in plug-in codice, ma non si sa quanti livelli di profondità il codice verrà memorizzato. Naturalmente si può scrivere il codice per capire tutto e li mappa, ma che diventa difficile e io non sono sicuro che si otterrebbe molto valore di cercare di capirlo, invece di utilizzare un approccio diverso.

esplicitamente assegnare i numeri di pagina

Quindi, la prima cosa che vorrei suggerire è che esplicitamente assegnare tuo i numeri di pagina per ogni post nel tuo serie utilizzando meta postale / custom campi (ho scelto il termine installment invece di page perché ha reso più senso per me, ma chiaramente si potrebbe usare qualsiasi termine che si adatta per il vostro caso d'uso).

L'assegnazione dei numeri di pagina / rata ha il vantaggio di voi di essere in controllo completo e in questo modo saprete cosa sistemare quando quarantina di Whack e se si desidera riordinare si può farlo semplicemente cambiando i numeri. Sto assumendo avrai una modifica METABOX per un campo personalizzato nome _installment per la selezione dei numeri rata (e potrebbe anche gestire i numeri / Juggle rata tramite la tecnologia AJAX, se si vuole ottenere in modo creativo che non si dispone di pagine fuori sincronia. )

Usa $wp_rewrite->add_rule() esplicitamente assegnare URL

Non voglio andare in profondità poiché so che hai in generale si è arrabbiato skilz WordPress quindi mi limiterò a punto che $wp_rewrite->add_rule() è la cruz di ottenere tutto questo al lavoro. Tutto il resto è solo fornendo il supporto intorno al risultato di quella funzione. Utilizzare il gancio init assegnare la regola URL:

<?php
add_action('init', 'add_series_installment_url');
function add_series_installment_url() {
  global $wp,$wp_rewrite;
  $wp->add_query_var('series');
  $wp->add_query_var('installment');
  $wp_rewrite->add_rule('series/([^/]+)/(installment-\d+)','index.php?series=$matches[1]&installment=$matches[2]','top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

con il gancio di parse_query di tradurre URL Query Vars

La seconda metà di questa soluzione utilizza il gancio parse_query che so molto di essere a conoscenza. In generale, abbiamo catturare l'query_vars definito init e catturato tramite la regola URL e li converte in quello che ci serve per interrogare post WordPress con taxonomy + term gestione della tua series e meta_key + gestire la rata / pagina esplicitamente assegnato meta_value:

<?php
add_action('parse_query', 'apply_series_installment_to_query');
function apply_series_installment_to_query(&$query) {
  if (isset($query->query['series']) && isset($query->query['installment']) && 
     preg_match('#^installment-(\d+)$#',$query->query['installment'],$match)) {
    $query->query_vars['post_type'] = 'post';
    $query->query_vars['taxonomy'] = 'series';
    $query->query_vars['term'] = $query->query['series'];
    $query->query_vars['meta_key'] = '_installment';
    $query->query_vars['meta_value'] = $match[1];
    unset($query->query_vars['series']);            // You don't need this
    unset($query->query_vars['installment']);       // or this
    unset($query->query_vars['name']);              // or this
  }
}

Sommario

Normalmente sarei andato in una molto più approfondita spiegare una risposta, ma è tardi, ho avuto troppo poco sonno nelle ultime 48 ore, e soprattutto so che può capire, è probabilmente solo bisogno di una cosa ho citato qui.

Così ho Spero vi piaccia questa soluzione. Anche se non si le due parti con init e parse_query e la $wp_rewrite->add_rule() e la $query->query_vars[] rispettivamente sono ciò che è necessario, anche se si vuole attaccare con la vostra architettura originale. fortuna e l'ora di vedere quando lo avete fatto e in linea Bene!

In ogni caso, speranza til suo aiuto.

Altri suggerimenti

Ecco il codice che uso per modificare il numero di messaggi su pagine di archivio di categorie e tag:

query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );

Se non è possibile fare questo lavoro con tassonomia personalizzato prova con native (categorie, tag) per verificare se il problema è con il codice stesso, con tassonomia o qualcosa di completamente diverso.

Anche io non so se vi siete persi questo o lasciato fuori, ma $ paging non è variabile globale. Deve essere inverosimile come get_query_var ( 'paging')

Una volta che ho affrontato problema di questo e passato tempi duri ore a ore tirando i capelli. Ho cercato su google e non ho trovato alcuna soluzione specifica sui temi. Ho trovato un articolo diversi talenti ma non erano soddisfacenti i miei problemi. In realtà su misura tassonomia pagina di archivio impaginazione è dipende da alcune impostazioni di argomenti di funzioni correlate. Così sto andando in realtà qui condividere i miei pensieri di risolvere il problema tassonomia dell'archivio impaginazione.

Cinque cose che avete bisogno per l'archivio tassonomia personalizzato pagina impaginazione perfettamente funzionante:

(1) Non mettere exclude_from_search chiave parametro come parametro argomento register_post_type o impostarlo 'exclude_from_search' => false. Di default è impostato false.

(2) La tassonomia che sarà l'uso con il set 'taxonomies' => 'custom_taxonomy_name' tipo di messaggio personalizzato come parametro argomento register_post_type o l'uso register_taxonomy_for_object_type() direttamente. tassonomie personalizzate devono ancora essere registrati register_taxonomy().

(3) durante l'interrogazione entro new WP_Query ($args)

i) Se non impostato in uso static front page amministratore prima new WP_Query($args)

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

e l'uso $query = new WP_Query( array( 'paged' => $paged ) );

ii) Se impostato in uso prima pagina di amministrazione statica prima di 'nuova WP_Query ($ args)':

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

e l'uso $query = new WP_Query( array( 'page' => $paged ) );

Ricordate di utilizzare il parametro posts_per_page e paged nella matrice di argomento new WP_Query($arg).

Se non impostato prima pagina statica, quindi è necessario utilizzare il parametro page nella matrice di argomento new WP_Query ($arg).

(4) Usare Wordpress funzione paginate_links( $args ) come nell'esempio qui sotto per rendere impaginazione nel file di modello di archivio.

<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
                  'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                  'format' => '?paged=%#%',  or   '/paged=%#%',  // if using pretty permalink
                   'current' => max( 1, get_query_var('paged') ),
                   'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of  new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
 ?>

(5) La funzione di uscita paginate_links() la ul li messa in vendita con classe di page-numbers. Se si utilizza bootstrap classe iniettare pagination al ul con l'aiuto di javascript o jquery e bellissimo impaginazione fantasia sarà uscita.

La speranza ora è possibile godere di impaginazione nel modello dell'archivio tassonomia senza alcun problema 404: -)

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