Was ich machen möchte:
Richten Sie die WP_Query
Paginierung in einer einzelnen benutzerdefinierten post-type.php-Vorlagendatei ein
Was habe ich getan
1) Erstellt einen Beitragstyp namens "Autoren". Jeder Beitrag innerhalb dieses Beitragstyps ist ein einzelner Autor.
2) Standardmäßige Seiten zum Bearbeiten von Beiträgen enthalten ein Dropdown-Menü, in dem alle Beiträge (Autoren) des benutzerdefinierten Beitragstyps des Autors aufgelistet sind.
3) Es wurde eine Vorlage für die Datei "single-authors.php" erstellt, in der alle Posts mit den Autoren-Metadaten aus der Dropdown-Liste abgefragt werden. Das Ergebnis ist eine Liste der Posts, denen derselbe Autor zugewiesen ist (eine Art Archiv):
<?php
// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;
/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
$paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
$paged = get_query_var( 'page' );
} else {
$paged = 1;
}
$args = array(
'posts_per_page' => 10,
'meta_key' => 'author_select',
'meta_value' => $author_id,
'paged' => $paged,
);
$temp = $wp_query;
$wp_query = NULL;
$wp_query = new WP_Query($args);
?>
<?php if( $wp_query->have_posts() ) : ?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>
<?php endwhile; ?>
<div class="single_navigation">
<?php if( get_adjacent_post( false, '', true ) ) { ?>
<span class="prev"><?php previous_post_link( '< %link' ) ?></span>
<?php } ?>
<?php if( get_adjacent_post( false, '', false ) ) { ?>
<span class="next"><?php next_post_link( '%link >' ) ?></span>
<?php } ?>
</div><!--/single navigation-->
<?php endif; ?>
<?php
$wp_query = null;
$wp_query = $temp;
wp_reset_query();
?>
Woran ich festhalte
Die Paginierungslinks werden nicht angezeigt. Ich habe einige Nachforschungen angestellt und festgestellt, dass sie die $wp_query
Variable verwenden. Als ich jedoch meine Abfragevariable in änderte $wp_query
, erschienen die Links, aber wenn geklickt wurde, geschah nichts.
Irgendeine Idee, wo ich falsch liege?
Bearbeiten:
Um einige Ihrer Fragen zu beantworten, gibt meine Abfrage die von mir abgefragten Posts erfolgreich aus. $ Author_id hat bereits einen Wert, den ich nicht in dieses Code-Snippet aufgenommen habe. Ebenso habe ich die eigentliche Inhaltsausgabe in der while-Schleife ausgelassen, da dieser Teil nicht das Problem ist. Das Problem ist, dass ich den Inhalt, der bereits in diesem einzelnen Beitrag vorhanden ist, paginieren muss.
Der Zweck dieser Funktionalität bestand darin, Posts zu ermöglichen, benutzerdefinierte Autoren zu haben (außerhalb des eingebauten Benutzersystems), und der Zweck dieser Vorlage besteht darin, alle Posts für einen bestimmten Autor (der bereits funktioniert) auszugeben.
the_title()
'meta_value' => $author_id
von der genannten Dropdown-Liste ausgefüllt? Und wenn Sie jeden Autor über das Dropdown-Menü auswählen, werden die ersten zehn Beiträge korrekt angezeigt?$author_query->have_posts()
zurückkehrttrue
und dass das$author_query
tatsächlich irgendwelche Beiträge enthält?Antworten:
Du hast 2 Probleme.
Erstes Problem
Die Linie
wird fehlschlagen, weil in der singulären Post-Ansicht, wenn die URL enthält
'/page/XX/'
, die Variable WordPress gesetzt ist'page'
und nicht'paged'
.Sie können denken,
'page'
statt zu verwenden'paged'
, aber das wird auch nicht funktionieren, weil WordPress die Anfrage umleiten wird , sobald die'page'
Variable für mehrseitige singuläre Posts (Seitentrennung mit<!--nextpage-->
) verwendet werden soll und sobald der Post nicht mehrseitig ist zur URL ohne'/page/XX/'
.Dies passiert, wenn Sie Ihre Abfragevariable benennen
$wp_query
.Die Lösung besteht darin, diese Umleitung zu verhindern, indem die dafür verantwortliche Funktion entfernt wird, die
'redirect_canonical'
verknüpft ist mit'template_redirect'
:Also, in Ihrem
functions.php
hinzufügen:Jetzt leitet WordPress nicht mehr weiter und setzt die
'paged'
Abfragevariable korrekt .Zweites Problem
next_posts_link()
undprevious_posts_link()
beide prüfenif ( ! is_single() )
, um die Paginierung anzuzeigen.Dies
is_single()
ist in Ihrem Fall der Fall, da Sie sich in einem einzelnen Beitrag vom Typ "Autor" befinden, sodass diese Funktionen nicht wie erwartet funktionieren können.Sie haben 3 Möglichkeiten:
query_posts
diese Option, um die Hauptabfrage zu überschreiben (wirklich nicht empfohlen).is_single()
für Seiten falsch ist und Ihr Code dort funktioniert.Das ist der Code für die Lösung Nr. 3:
und benutze es wie folgt
single-authors.php
:quelle
the_posts_pagination
, musste aber eine Kopie der ursprünglichen wp_query nehmen, wie in dieser Frage beschrieben: wordpress.stackexchange.com/questions/216821/…Basierend auf einer ähnlichen WPSE-Frage "Die Paginierung funktioniert nicht mit benutzerdefinierten Feldwerten für wp_query " würde ich vorschlagen
global $paged;
, am Anfang Ihrer Vorlagendatei Folgendes hinzuzufügen :quelle
$GLOBALS['paged'] = get_query_var( 'paged' );
. Andernfalls verwenden Sie einfach den globalen Inhalt.$author_query
zu ändern ,$wp_query
und dies schien die Paginierung erscheinen zu lassen, aber wenn ich darauf klicke, wird die Seite aktualisiert und tatsächlich nicht zur nächsten Seite gewechselt , obwohl es mehrere Seiten gibt. Ich habe meine Antwort aktualisiert, um diese Änderungen widerzuspiegeln.global
und herumzuspielen$GLOBALS
. Ein bisschenvar_dump()
, einige Funktionen und es geht dir gut. Um es mit ein wenig Versuch / Irrtum wirklich zu verstehen, werden Sie ca. brauche eine halbe Stunde. Auf diese Weise können Sie Funktionen im Vergleich zu Klassen und den OOP-Ansatz insgesamt besser verstehen. Und es wird Sie dem Verständnis von Namespaces deutlich näher bringen :)