it-swarm.com.de

Beheben der Paginierung mit Custom Taxonomy Archive

Ich habe versucht, eine Methode zum Schreiben von Beiträgen in einer Reihe auf meiner Website einzurichten. Die Idee ist, dass jeder Beitrag in einer benutzerdefinierten Taxonomie zu einer anderen Serie gehören kann. Ich habe fast alles so eingerichtet, wie ich es will ... mit einer Ausnahme.

Registrieren der Taxonomie

Dieser Teil funktioniert. Ich habe den folgenden Code in ein Plug-In eingefügt:

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

Dadurch wird dem Dropdown-Menü "Posts" "Series Labels" (Serienbezeichnungen) hinzugefügt und im Post-Bearbeitungsbildschirm ein Feld "Series Labels" (Serienbezeichnungen) angezeigt. Alles funktioniert und ich kann Beiträge als Teil einer Serie perfekt markieren. Das Problem liegt im nächsten Abschnitt ...

Auflisten von Elementen in der Taxonomie

Mein Ziel ist es, den Lesern zu ermöglichen, einen Beitrag nach dem anderen zu lesen, beginnend mit dem ältesten Beitrag und chronologisch vorwärts zu gehen. Dies ist etwas anderes als eine typische Archivseite, da ich 10 Posts pro Seite für meine Archive habe, aber ich möchte natürlich nur einen Post pro Seite für mein Serienarchiv.

Ich habe in meiner Vorlage eine taxonomy-series.php-Datei erstellt. Und es die Hälfte funktioniert. Die erste Seite funktioniert einwandfrei - http://localhost/wp/series/my-test-series/ zeigt den ersten Artikel der Serie mit dem Link "Nächster Eintrag" "am unteren Rand der Seite an. So weit, ist es gut ...

Wenn Sie jedoch auf "Nächster Eintrag" klicken und zur nächsten Seite (http://localhost/wp/series/my-test-series/page/2/) wechseln, ist dies a) der falsche Artikel und b) die falsche Vorlage!

Wenn ich jedoch auf der Leseseite "Blog-Seiten zeigen höchstens:" auf "1" setze (normalerweise auf 10), funktionieren die Dinge einwandfrei. Seite 2 zeigt den zweiten Artikel, Seite 3 zeigt den dritten usw.

Also ... was muss ich überprüfen, um zu erzwingen, dass auf der Taxonomie-Archivseite nur ein Beitrag auf jeder Seite angezeigt wird? Ich habe Folgendes versucht:

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

vergebens ... ideen? Tipps? Vorschläge?

4
EAMann

Hallo @EAMann :

Ich erschrecke jedes Mal, wenn ich etwas Kreatives mit URLs in WordPress machen muss, da das URL-System meiner Meinung nach der mit Abstand uneleganteste Aspekt von WordPress ist. Ich habe immer das Gefühl, dass ich WordPress bekämpfen muss, damit es das macht, was ich will, und dass WordPress mich in Bezug auf URLs aktiv bekämpft. Also mit diesem Öffner ...

Wenn Sie Ihr Problem durchdenken, werde ich einen Vorschlag machen, der nicht genau das ist, wonach Sie gefragt haben. Wenn Sie nicht finden, dass es das ist, wonach Sie suchen, ist das in Ordnung. Bitte stimmen Sie nicht ab, weil ich nur versuche zu helfen.

Taxonomie ist kein Einzelschritt und hat kein Meta

Eines der Probleme mit dem, was Sie versuchen, ist das Taxonomiesystem hat keine einzige inkrementelle Reihenfolge und es hat kein Meta . Beispielsweise finden Sie in einer Serie mit 3 Beiträgen möglicherweise Begriffe mit IDs von 373, 411 und 492; Sie können sich vorstellen, dass 373 = #1, 411 = #2 und 492 = #3, aber das ist alles Zufall und relativ zueinander. Es ist wie der Versuch, das Stammverzeichnis Ihrer WordPress-Site im Plugin-Code zu lokalisieren, aber Sie wissen nicht, wie viele Ebenen tief Ihr Code gespeichert wird. Natürlich kann man Code schreiben, um alles herauszufinden und zuzuordnen, aber das wird schwierig, und ich bin mir nicht sicher, ob Sie einen großen Nutzen daraus ziehen würden, es herauszufinden, anstatt einen anderen Ansatz zu verwenden.

Ordnen Sie Ihre Seitennummern explizit zu

Als erstes würde ich vorschlagen, dass Sie explizit Ihre Seitenzahlen für jeden Beitrag in Ihrer Serie Post-Meta/benutzerdefinierte Felder verwenden (ich habe den Begriff installment anstelle von page, weil es für mich sinnvoller war, aber Sie könnten jeden Begriff verwenden, der für Ihren Anwendungsfall passt.)

Das Zuweisen von Seiten-/Teilzahlungsnummern hat den Vorteil, dass Sie die vollständige Kontrolle haben. Auf diese Weise wissen Sie, was zu beheben ist, wenn etwas nicht stimmt, und wenn Sie die Reihenfolge ändern möchten, können Sie dies einfach durch Ändern der Nummern tun. Ich gehe davon aus, dass Sie über eine Bearbeitungs-Metabox für einen benutzerdefinierten Feldnamen _installment zur Auswahl der Ratenzahlen verfügen (und sie kann sogar Ratenzahlen über AJAX verwalten/jonglieren, wenn Sie kreativ werden möchten, damit Sie nie haben nicht synchronisierte Seiten.)

Verwenden Sie $wp_rewrite->add_rule(), um Ihre URL explizit zuzuweisen

Ich werde nicht weiter darauf eingehen, da ich weiß, dass Sie im Allgemeinen verrückte WordPress-Kenntnisse haben. Deshalb möchte ich darauf hinweisen, dass $wp_rewrite->add_rule() der springende Punkt ist, um all dies zum Laufen zu bringen. Alles andere bietet nur Unterstützung rund um das Ergebnis dieser Funktion. Verwenden Sie den Haken init, um Ihre URL-Regel zuzuweisen:

<?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 Sie den Hook parse_query, um URLs in Abfragevariablen zu übersetzen

In der zweiten Hälfte dieser Lösung wird der Hook parse_query verwendet, mit dem Sie sich bestens auskennen. Im Allgemeinen erfassen wir den in init definierten query_vars und erfassen ihn über die URL-Regel und konvertieren ihn in das, was wir zum Abfragen von WordPress-Posts mit taxonomy + term und series benötigen meta_key + meta_value für die explizit zugewiesene 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 hätte ich eine Antwort viel ausführlicher 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 brauchten wahrscheinlich nur eine Sache, die ich hier erwähnte .

Deshalb hoffe ich, dass Ihnen diese Lösung gefällt. Auch wenn Sie die beiden Teile mit init und parse_query und die $wp_rewrite->add_rule() bzw. den $query->query_vars[] nicht benötigen, sind Sie selbst dann gefragt, wenn Sie an Ihrer ursprünglichen Architektur festhalten möchten. Viel Glück und freue mich darauf, es zu sehen, wenn Sie es fertig haben und online!

Wie auch immer, ich hoffe, das hilft.

6
MikeSchinkel

Hier ist der Code, den ich verwende, um die Anzahl der Beiträge auf Archivseiten mit Kategorien und Tags zu ändern:

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

Wenn dies mit einer benutzerdefinierten Taxonomie nicht möglich ist, versuchen Sie es mit nativen (Kategorien, Tags), um zu überprüfen, ob das Problem mit dem Code selbst, mit der Taxonomie oder etwas ganz anderem zusammenhängt.

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

2
Rarst

Sobald ich ein Problem damit hatte und harte Zeiten von Stunde zu Stunde überstanden habe, indem ich an den Haaren gezogen habe. Ich habe gegoogelt und zu den Themen keine konkrete Lösung gefunden. Ich habe den Artikel mehrerer Talente gefunden, aber sie haben meine Probleme nicht gelöst. Die tatsächliche Paginierung einer benutzerdefinierten Taxonomie-Archivseite hängt von einigen Einstellungen der Argumente verwandter Funktionen ab. Ich gehe hierher, um meine Gedanken über die Lösung des Problems der Paginierung des Taxonomie-Archivs mitzuteilen.

Fünf Dinge, die Sie brauchen, um die Paginierung einer benutzerdefinierten Taxonomie-Archivseite zu optimieren:

(1) Setzen Sie den exclude_from_search-Parameterschlüssel nicht als register_post_type-Argumentparameter oder setzen Sie ihn auf 'exclude_from_search' => false. Standardmäßig ist false eingestellt.

(2) Die Taxonomie, die mit dem benutzerdefinierten Beitragstyp verwendet wird, setzt 'taxonomies' => 'custom_taxonomy_name' als Argumentparameter register_post_type oder verwendet register_taxonomy_for_object_type() direkt. Benutzerdefinierte Taxonomien müssen noch bei register_taxonomy() registriert werden.

(3) Während der Abfrage innerhalb von new WP_Query ($args)

i) Wenn nicht in admin static front page festgelegt, vor new WP_Query($args) verwenden

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

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

ii) Wenn in der statischen Admin-Startseite festgelegt, verwenden Sie vor 'new WP_Query ($ args)':

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

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

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

Wenn Sie keine statische Startseite festlegen, sollten Sie den Parameter page im Argumentarray new WP_Query ($arg) verwenden.

(4) Verwenden Sie die Wordpress-Funktion paginate_links( $args ) wie im folgenden Beispiel, um die Paginierung in der Archivvorlagendatei wiederzugeben.

<?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 Funktion paginate_links() gibt die Liste ul li mit der Klasse page-numbers aus. Wenn Sie Bootstrap verwenden, fügen Sie pagination class in die ul mit Hilfe von Javascript oder jquery ein und es wird eine schicke Paginierung ausgegeben.

Hoffe, Sie können nun die Paginierung in der Taxonomie-Archivvorlage ohne 404-Probleme genießen :-)

0
saifulmasud