Ich habe myfile.php
mit folgendem Inhalt erstellt:
global $paged;
if ( get_query_var( 'paged' ) ) {
$paged = get_query_var( 'paged' );
} else if ( get_query_var( 'page' ) ) {
$paged = get_query_var( 'page' );
} else {
$paged = 1;
}
$args = array(
'post_type' => array('my_custom_post_type'),
'paged' => $paged,
'posts_per_page' => 3,
'ignore_sticky_posts' => 1
);
$wp_query = new WP_Query( $args );
var_dump($wp_query);
if($wp_query->have_posts()) :
while($wp_query->have_posts()) : $wp_query->the_post();
// show post
endwhile;
endif;
next_posts_link('Next posts');
wp_reset_query();
wp_reset_postdata();
und:
Ich habe keine Ahnung, was ich hier vermisse, aber ich habe nur jeden einzelnen Vorschlag aus der Anleitung zur Fehlerbehebung auf dieser Seite ausprobiert: https://codex.wordpress.org/Pagination - Sie schlagen vor, dass "404 - nicht gefunden" eines der häufigsten Probleme ist, wenn die Permalinks auf "Benutzerdefinierte Struktur" gesetzt sind, sodass WP Entwickler einen Fehler oder ein Problem kennen, dies aber nicht sagen wie man das behebt.
Mein Server ist WAMP für Windows 7 (PHP 5.4.3, Apache 2.4.2, mod_rewrite
aktiviert, benutzerdefinierte Linkstrukturen funktionieren sehr gut, wenn "myfile.php" nicht als "Static Front Page" verwendet wird).
Mein .htaccess wenn "Custom Permalink Structure" auf "Post name" gesetzt ist:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>
# END WordPress
Wenn ich http://example.com/mypage/page/2 eingebe (funktioniert nicht): SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'page' AND wp_posts.post_type = 'my_custom_post_type' ORDER BY wp_posts.post_date DESC
Wenn ich http://example.com/?page_id=1234&paged=2 eingebe (funktioniert): SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'my_custom_post_type' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 2, 2
Ich habe dies mit mehreren eigenen Plugins erlebt, als ich versucht habe, eine numerische Paginierung für meine benutzerdefinierten Beitragstypen und Taxonomien anzuzeigen.
Nach meinem Verständnis können Sie durch die Verwendung von WP_Query
zum Abrufen von Posts aus der Datenbank auf Ihre eigene benutzerdefinierte Weise (außer der Standardeinstellung) keine Funktionen wie verwenden erwartet.
Sie sind für die Standardabfrage nach Beiträgen vorgesehen. Wenn Sie diese Funktionen also wie vorgesehen verwenden möchten, müssen Sie die Standardabfrage ändern, bevor die Abfrage ausgeführt wird. Sie können dies mit dem Haken pre_get_posts
tun.
Wenn Sie jedoch eine eigene benutzerdefinierte Abfrage mit WP_Query
verwenden möchten, müssen Sie auch die Funktionsweise der numerischen Paginierung anpassen. Sie können mit der Standard-WordPress-Funktionalität das gleiche Nettoergebnis erzielen, benötigen jedoch ein paar zusätzliche Codezeilen, um die erwartete numerische Paginierung zu erreichen.
Angenommen, Sie haben eine benutzerdefinierte Abfrage mit WP_Query
und sie sieht ungefähr so aus:
$query = new WP_Query( $query_args );
Dies bedeutet, dass Sie eine komplett brandneue Abfrage haben, dieanders istals die Standardabfrage, die beim Laden der Seite ausgeführt wird.
Jetzt sind WordPress ZWEI Abfragen für die aktuelle Seite bekannt:
WP_Query
erstellt haben.Wenn Ihre numerische Paginierung mit Ihrer benutzerdefinierten Abfrage zusammenarbeiten soll, müssen Sie die aktuelle Seite kennen, auf der die Anforderung ausgeführt wird.
Die aktuelle Seitennummer wird tatsächlich als paged
bezeichnet. Sie können die aktuelle Seitenzahl mit folgendem Code ermitteln:
$current_page = 1;
if ( get_query_var( 'paged' ) ) {
$current_page = get_query_var( 'paged' );
}
Nachdem die aktuelle Seite ermittelt wurde, können Sie Ihre benutzerdefinierte Abfrage folgendermaßen einrichten:
$query_args = array(
'post_type' => 'products',
'post_status' => 'publish',
'posts_per_page' => 10,
'paged' => absint( $current_page )
);
$query = new WP_Query( $query_args );
Nachdem die Abfrage durchgeführt wurde, müssen Sie überprüfen, ob sich Beiträge in der Datenbank befinden, die Ihren Kriterien entsprechen:
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// Post content here...
}
} else {
// No posts...
}
Nun zur numerischen Paginierung! Ich empfehle die Verwendung einer WordPress-Funktion namens paginate_links()
für diesen Teil.
Ich verstehe den wirklich unwahrscheinlichen Integer-Teil für die base
nicht wirklich, aber das wird auf der oben verlinkten WordPress-Codex-Seite demonstriert.
paged
) erneut angeben.$query
abgerufen werden können).$big = 999999999; // need an unlikely integer
$previous_text = '« Previous';
$next_text = 'Next »';
$pagination = paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?current_page=%#%',
'current' => max( 1, $current_page ),
'total' => $query->max_num_pages,
'type' => 'array',
'prev_text' => $previous_text,
'next_text' => $next_text
) );
Dieser Code muss in die Bedingung gestellt werden, dass Beiträge verfügbar sind. Nicht innerhalb der Schleife, sondern unmittelbar NACH der Schleife.
Sobald die numerische Paginierung konfiguriert wurde, kann sie ausgegeben (oder angezeigt) werden. Hier werden paginierte Elemente im Format array
zurückgegeben.
Ich möchte es mit einer bedingten Prüfung abschließen und dann die Elemente durchlaufen, die auf dem Weg zusätzliche bedingte Prüfungen durchführen.
if ( $pagination ) {
$content .= '<div class="clearfix"></div>' . PHP_EOL;
$content .= '<nav id="numerical-pagination" class="text-center">' . PHP_EOL;
$content .= '<ul class="pagination">' . PHP_EOL;
foreach ( $pagination as $pagination_item ) {
$class = '';
if ( stripos( $pagination_item, 'current' ) !== false ) {
$class = ' class="active"';
}
if ( stripos( $pagination_item, 'dots' ) !== false ) {
$class = ' class="disabled"';
}
$content .= '<li' . $class . '>' . $pagination_item . '</li>' . PHP_EOL;
}
$content .= '</ul>' . PHP_EOL;
$content .= '</nav><!-- end #numerical-pagination .text-center -->' . PHP_EOL;
$content .= '<div class="clearfix"></div>' . PHP_EOL;
echo $content;
}
Hinweis: Ich verwende Bootstrap für meine WordPress-Themes. Wenn Sie also möchten, dass Ihre Paginierung mit minimalem Aufwand fantastisch aussieht. Probieren Sie Bootstrap aus.
Um alles oben Erwähnte abzuschließen, finden Sie hier eine Komplettlösung zum Kopieren und Einfügen für alle, die eine numerische Paginierung mit einer benutzerdefinierten Post-Abfrage unter Verwendung von WP_Query
erstellen möchten.
$current_page = 1;
if ( get_query_var( 'paged' ) ) {
$current_page = get_query_var( 'paged' );
}
$query_args = array(
'post_type' => 'products',
'post_status' => 'publish',
'posts_per_page' => 10,
'paged' => absint( $current_page )
);
$query = new WP_Query( $query_args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// Post content here...
}
$big = 999999999; // need an unlikely integer
$previous_text = '« Previous';
$next_text = 'Next »';
$pagination = paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?current_page=%#%',
'current' => max( 1, $current_page ),
'total' => $query->max_num_pages,
'type' => 'array',
'prev_text' => $previous_text,
'next_text' => $next_text
) );
$content = '';
if ( $pagination ) {
$content .= '<div class="clearfix"></div>' . PHP_EOL;
$content .= '<nav id="numerical-pagination" class="text-center">' . PHP_EOL;
$content .= '<ul class="pagination">' . PHP_EOL;
foreach ( $pagination as $pagination_item ) {
$class = '';
if ( stripos( $pagination_item, 'current' ) !== false ) {
$class = ' class="active"';
}
if ( stripos( $pagination_item, 'dots' ) !== false ) {
$class = ' class="disabled"';
}
$content .= '<li' . $class . '>' . $pagination_item . '</li>' . PHP_EOL;
}
$content .= '</ul>' . PHP_EOL;
$content .= '</nav><!-- end #numerical-pagination .text-center -->' . PHP_EOL;
$content .= '<div class="clearfix"></div>' . PHP_EOL;
echo $content;
}
wp_reset_postdata();
} else {
// No posts...
}
wp_reset_query();
Sie können auch den folgenden Code ausprobieren.
function custom_type_archive_display($query) {
if (is_post_type_archive('custom_post_type') )
{
$query->set('posts_per_page',10);
return;
}
}
add_action('pre_get_posts', 'custom_type_archive_display');