Frage

Ich habe versucht, einen Weg zu schaffen, Beiträge in einer Serie auf meiner Website zu schreiben. Die Idee ist, dass jeder Beitrag zu einer anderen Serie in einer benutzerdefinierten Taxonomie gehören kann. Ich habe so gut wie alles so eingerichtet, wie ich es will ... mit einer Ausnahme.

Registrierung der Taxonomie

Dieser Teil funktioniert. Ich habe den folgenden Code in ein Plug-In fallen gelassen:

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 );

Dies fügt dem Dropdown -Menü "Serien -Labels" "Serienbezeichnungen" hinzu und gibt mir ein "Serien -Labels" -Box auf dem Bildschirm "Post Bearbeiten". Alles funktioniert und ich kann Posts als Teil einer Serie perfekt markieren. Das Problem liegt im nächsten Abschnitt ...

Auflistung von Gegenständen in der Taxonomie

Mein Ziel ist es, den Lesern zu ermöglichen, jeweils eine Serie 1 zu durchlaufen, beginnend mit dem ältesten Beitrag und chronologisch vorwärts zu bewegen. Dies ist anders als eine typische Archivseite, da ich 10 Beiträge pro Seite für mein Archiv habe, aber offensichtlich möchte ich Nur ein Beitrag pro Seite Für mein Serienarchiv.

Ich habe a erstellt taxonomy-series.php Datei in meiner Vorlage. Und es halb Arbeiten. Die erste Seite funktioniert gut - http://localhost/wp/series/my-test-series/ Zeigt den ersten Artikel in der Serie mit dem Link "Nächster Eintrag» "unten auf der Seite an. So weit, ist es gut ...

Aber wenn Sie auf "Nächster Eintrag» klicken und zur nächsten Seite gehen (http://localhost/wp/series/my-test-series/page/2/) Es ist a) der falsche Artikel und b) die falsche Vorlage!

Wenn ich jedoch "Blogseiten zeigen höchstens:" auf "1" auf der Leseseite (es ist normalerweise auf 10 eingestellt), funktioniert die Dinge gut. Seite 2 Zeigt den zweiten Artikel an, Seite 3 zeigt den dritten usw. an.

Also ... was muss ich überprüfen, um die Taxonomie -Archivseite zu zwingen, nur einen Beitrag auf jeder Seite anzuzeigen? Ich habe Folgendes ausprobiert:

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

query_posts($new_query);

und

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

ohne Erfolg ... Ideen? Tipps? Anregungen?

War es hilfreich?

Lösung

Hi @Amann:

Ich erschrecke immer, wenn ich mit URLs in WordPress etwas Kreatives machen muss, da das URL -System meiner Meinung nach bei weitem der uneleganteste Aspekt von WordPress ist. Ich habe immer das Gefühl, dass ich WordPress bekämpfen muss, um es dazu zu bringen, das zu tun, was ich will, und diese WordPress kämpft aktiv gegen mich zurück, die mit URLs verbunden sind. Also mit diesem Opener ...

Wenn Sie Ihr Problem durchdenken, werde ich einen Vorschlag machen, der nicht genau das ist, wonach Sie gefragt haben. Wenn Sie es nicht finden, wonach Sie suchen, ist das in Ordnung, bitte, niemand fällt ab, weil ich nur versuche zu helfen.

Taxonomie ist kein einzelnes Inkrement und hat kein Meta

Eines der Probleme mit dem, was Sie versuchen zu tun, ist Das Taxonomiesystem ist keine einzige Inkrementauftragung und es hat kein Meta. Zum Beispiel in einer 3 Post -Serie finden Sie möglicherweise Begriffe IDs von 373, 411 und 492; Sie können das finden 373 = #1, 411 = #2 und 492 = #3 Aber das ist alles Zufall und relativ zueinander. Es ist wie der Versuch, das Root Ihrer WordPress -Site in Plugin -Code zu locken, aber Sie wissen nicht, wie viele Ebenen tief Ihr Code gespeichert werden. Natürlich kann Code schreiben, um alles herauszufinden und sie abzubilden, aber das wird schwierig, und ich bin mir nicht sicher, ob Sie viel Wert haben würden, um es herauszufinden, anstatt einen anderen Ansatz zu verwenden.

Weisen Sie Ihre Seitenzahlen explizit zu

Das erste, was ich vorschlagen würde, ist das Sie explizit zuweisen dein Seitenzahlen Für jeden Beitrag in Ihrer Serie Verwenden von Post -Meta-/benutzerdefinierten Feldern (ich habe den Begriff ausgewählt installment Anstatt von page Weil es für mich sinnvoller war, aber eindeutig könnten Sie jeden Begriff verwenden, der für Ihren Anwendungsfall passt.)

Die Zuweisung von Seite/Ratenzahlungsnummern hat den Vorteil, dass Sie die vollständige Kontrolle haben. Auf diese Weise wissen Sie, was Sie beheben sollen, wenn Sie etwas aus dem Rennen haben, und wenn Sie erneut ordnen möchten, können Sie dies nur durch Ändern der Zahlen tun. Ich gehe davon aus, dass Sie einen Bearbeitungsmetabox für einen benutzerdefinierten Feldnamen haben _installment Für die Auswahl der Ratenzahlungsnummern (und es könnte sogar Ratennummern über AJAX verwalten/jonglieren, wenn Sie kreativ werden möchten, damit Sie nie Seiten außerhalb der Synchronisierung haben.)

Verwenden $wp_rewrite->add_rule() Um Ihre URL explizit zuzuweisen

Ich werde nicht ausführlich gehen, da ich weiß, dass Sie im Allgemeinen verrückte WordPress Skilz geworden sind, also werde ich darauf hinweisen $wp_rewrite->add_rule() Ist der Cruz, um alles zum Laufen zu bringen. Alles andere liefert nur das Ergebnis dieser Funktion. Verwenden Sie das init Haken zuweisen Sie Ihre URL -Regel:

<?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
}

Verwenden parse_query Haken, um URL in Vars zu übersetzen

Die 2. Hälfte dieser Lösung verwendet die parse_query Haken, mit dem ich kenne, mit dem Sie sehr vertraut sind. Im Allgemeinen erfassen wir das query_vars definiert in init und über die URL -Regel erfasst und in das umwandeln, was wir mit WordPress -Posts abfragen müssen taxonomy+term mit deinem umgehen series und meta_key+meta_value Umgang mit der explizit zugewiesenen Rate/Seite:

<?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
  }
}

Zusammenfassung

Normalerweise wäre ich in viel mehr Tiefe eine Antwort erklärt, aber es ist spät, ich habe in den letzten 48 Stunden zu wenig geschlafen, und vor allem weiß ich, dass Sie es herausfinden können. Sie haben wahrscheinlich nur eine Sache gebraucht, die ich hier erwähnt habe .

Ich hoffe, Ihnen gefällt Ihnen diese Lösung. Auch wenn Sie die beiden Teile nicht mit init und parse_query und die $wp_rewrite->add_rule() und die $query->query_vars[] Sie brauchen jeweils, auch wenn Sie sich an Ihre ursprüngliche Architektur halten möchten. Viel Glück und freue mich darauf, es zu sehen, wenn Sie es erledigt und online haben!

Wie auch immer, hoffe das hilft.

Andere Tipps

Hier ist Code, mit dem ich die Anzahl der Beiträge auf Archivseiten von Kategorien und Tags ändern kann:

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

Wenn Sie dies nicht mit benutzerdefinierten Taxonomie mit Einheimischen (Kategorien, Tags) versuchen können, um zu überprüfen, ob das Problem mit dem Code selbst mit Taxonomie oder etwas ganz anderem ist.

Ich bin mir auch nicht sicher, ob Sie dies verpasst oder ausgelassen haben, aber $ Page ist keine globale Variable. Es muss als Get_query_var ('PAGED') abgerufen werden.

Sobald ich ein Problem damit hatte und harte Zeiten an HRS an HRS überging, indem ich Haare zog. Ich habe gegoogelt und keine bestimmte Lösung zu den Themen gefunden. Ich habe mehrere Talente gefunden, aber sie haben meine Probleme nicht befriedigt. Tatsächlich hängt die Pagination des benutzerdefinierten Taxonomie -Archivs von einigen Einstellungen von Argumenten der verwandten Funktionen ab. Ich gehe also hierher und teile meine Gedanken an die Lösung des Taxonomie -Archivpaginationsproblems.

Fünf Dinge, die Sie für das benutzerdefinierte Taxonomie -Archiv -Seitenpagination benötigen, funktionieren perfekt:

(1) Nicht setzen exclude_from_search Parameterschlüssel als register_post_type Argumentparameter oder festlegen 'exclude_from_search' => false. Standardmäßig wird es festgelegt false.

(2) Die Taxonomie, die mit dem benutzerdefinierten Post -Type -Set verwendet wird 'taxonomies' => 'custom_taxonomy_name' wie register_post_type Argumentparameter oder Verwendung register_taxonomy_for_object_type() direkt. Zolltaxonomien müssen noch mit registriert werden register_taxonomy().

(3) beim Abfragen innerhalb new WP_Query ($args)

i) Wenn nicht in Admin eingestellt ist static front page zu verwenden, bevor new WP_Query($args)

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

und verwenden $query = new WP_Query( array( 'paged' => $paged ) );

ii) Wenn Sie auf der admin -statischen Titelseite eingestellt sind, verwenden Sie vor 'neuem WP_QUERY ($ args)':

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

und verwenden $query = new WP_Query( array( 'page' => $paged ) );

Denken Sie daran zu verwenden posts_per_page und paged Parameter in new WP_Query($arg) Argumentarray.

Wenn Sie nicht die statische Titelseite festlegen, sollten Sie verwenden page Parameter in new WP_Query ($arg) Argumentarray.

(4) WordPress verwenden paginate_links( $args ) Funktion wie das Beispiel unten, um die Pagination in der Archivvorlagendatei zu rendern.

<?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) die paginate_links() Funktion Ausgabe der ul li Auflistung mit page-numbers Klasse. Wenn Sie Bootstrap Inject verwenden pagination Klasse zum ul Mit Hilfe von JavaScript oder JQuery und einer schönen ausgefallenen Pagination wird ausgegeben.

Ich hoffe, Sie können jetzt Pagination in der Taxonomie-Archivvorlage ohne 404-Problem genießen :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top