it-swarm.com.de

Paginierung funktioniert nicht

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:

  • wenn unter "Einstellungen"> "Lesen" die Option "Statische Startseite" ausgewählt ist, funktioniert dies problemlos mit Paginierung. Ich kann auf http://example.com/page/2 zugreifen
  • wenn Einstellungen> Permalinks auf "Standardmäßige Permalinks-Struktur" eingestellt ist, funktioniert dies mit http://example.com/?page_id=1234&paged=2
  • wenn "Einstellungen> Permalinks" auf "Benutzerdefinierte Struktur" eingestellt ist, wird "404.php" durch die folgende http://example.com/mypage/page/2 gestartet.

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

1
Paul

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:

  1. Abfrage # 1 ist dieStandardabfrage.
  2. Abfrage Nr. 2 ist Ihrebenutzerdefinierte Abfrage, die Sie gerade mit 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.

  • Sie müssen die aktuelle Seite (paged) erneut angeben.
  • Sie müssen die Gesamtzahl der Posts kennen (die aus dem variablen Objekt $query abgerufen werden können).
  • Sie müssen einen Rückgabetyp für diese Funktion angeben. (Ich persönlich mag es, wenn es im Array-Format vorliegt, damit ich die Paginierung anpassen kann, wie ich es für richtig halte.).

$big = 999999999; // need an unlikely integer

$previous_text = '&laquo; Previous';
$next_text     = 'Next &raquo;';

$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 = '&laquo; Previous';
    $next_text     = 'Next &raquo;';

    $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();
1
Michael Ecklund

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');
0
Jigar Gorakhiya