wake-up-neo.net

Verwandte Beiträge der Autorenseite funktionieren nicht auf der Produktionsseite

Der von mir verwendete Code wurde aus diesem Beispiel angepasst und erfolgreich auf meinem localhost getestet. Wenn ich die Site jedoch an einen Live-Server weitergebe, stürzt die Paginierung mit festgelegten WordPress-Permalinks (/% postname% /) ab und funktioniert nur mit den voreingestellten wp permalinks (? p = 123). Das Problem ist, dass es mir keine 404-Seite anzeigt, aber es lässt mich auch nicht zur zweiten oder dritten Seite oder zu den anderen, falls vorhanden.

Dies ist eine Listingseite (benutzerdefinierter Posttyp) (single-listing.php) und ich habe die folgende Seite:

  1. Der aktuelle Inhalt einer einzelnen Auflistung;
  2. Bemerkungen;
  3. Dieser Code (um alle Beiträge des Autors dieser Auflistung aufzulisten);
  4. Verwandte Einträge

Ich habe einige Nachforschungen angestellt und sogar versucht, "paged" zu ersetzen, da die Abfragevariable für paginierte Archive und einzelne Posts "page" verwenden sollte, und folgte @pietergoosen einem Hinweis zu diesem Hinweis , indem ich mysql aktivierte. trace_mode in meiner lokalen php.ini. Danach habe ich alle Dienste in wampp neu gestartet und die Paginierung auf localhost hat funktioniert, daher glaube ich nicht, dass dies das Problem sein könnte.

Das ist mein Code:

  <?php  
  global $authordata, $post;

$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$args = array( 
    'author'            => $authordata->ID, 
    'post_type'         => 'post', 
    'post__not_in'      => array( $post->ID ), 
    'posts_per_page'    => 3,
    'paged'             => $paged
);
$authors_posts = new WP_Query( $args );

if( $authors_posts->have_posts()) : while( $authors_posts->have_posts()) : 
$authors_posts->the_post(); ?>

<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" ><?php the_title(); ?></a>

 <?php the_post_thumbnail( array(80,135));?>
 <?php $excerpt = get_the_excerpt(); echo string_limit_words($excerpt,40);?>
        <?php endwhile; ?>

 <?php if($authors_posts->max_num_pages)
 if(function_exists('wp_pagenavi'))
 wp_pagenavi(array(
'query' =>$authors_posts   
 )); ?>
 <?php endif; wp_reset_query(); ?>

EDIT

Ich habe die Antwort @pietergoosen als die ausgewählt, die mein Problem gelöst hat, aber ich habe nicht verstanden, warum mein Code nicht mehr auf einem Live-Server funktioniert. Jetzt werde ich diese Informationen wahrscheinlich nie nutzen, aber ich werde mit Sicherheit gerne wissen, warum mein Code auf localhost (mit wampserver) und nicht auf einem Live-Server funktioniert ...

Wenn Sie die Antwort auf diese Frage kennen, kommentieren Sie bitte. Vielen Dank!

3
Alex

Wie gesagt, dieses ganze Setup, nach dem Sie suchen, ist von Haus aus mit hübschen Permalinks nicht möglich. Ihr Setup funktioniert wahrscheinlich mit der Standard-Permalink-Struktur, da beide Abfragen (die Hauptabfrage und Ihre benutzerdefinierte Abfrage) diese Permalinks auf dieselbe Weise lesen. Wenn Sie zu hübschen Permalinks wechseln, interpretieren die beiden Abfragen auf einer Seite die URL unterschiedlich, sodass die eine oder andere Abfrage fehlschlägt, wenn Sie versuchen, Ihre benutzerdefinierte Abfrage zu paginieren

Einzelne Seiten sollten niemals auf diese Weise paginiert werden, insbesondere mit hübschen Permalinks. Ich habe ein paar Ideen durchgespielt, und der beste Weg, dies zu erreichen, ist

  • So schreiben Sie Ihre eigenen Paginierungsfunktionen, mit denen die Seitenzahl von der URL gelesen werden kann

  • Schreiben Sie Ihre eigene Funktion, mit der die Seitenzahl an die URL angehängt werden kann, beispielsweise /2/ zur URL einzelner Seiten.

Ich muss betonen, dass, wenn Sie einen einzelnen Beitrag mit <!--nextpage--> paginieren, dieser Beitrag auch zusammen mit Ihrer benutzerdefinierten Abfrage paginiert wird. Wenn Ihre Permalink-Struktur nicht auf /%postname%/ eingestellt ist, schlägt der Code fehl und zeigt eine Fehlermeldung über wp_die() an.

DER CODE

Hier ist der Code, der die nächste/vorherige Seite abruft und auch die Seitennummer zur URL hinzufügt.

function get_single_pagination_link( $pagenum = 1 ) {
    global $wp_rewrite;

    if( is_singular() && $wp_rewrite->permalink_structure == '/%postname%/') {

        $pagenum = (int) $pagenum;

        $post_id = get_queried_object_id();
        $request = get_permalink( $post_id );

        if ( $pagenum > 1 ) {
            $request = trailingslashit( $request ) . user_trailingslashit( $pagenum );
        }

        return esc_url( $request );

    }else{

        wp_die( '<strong>The function get_single_pagination_link() requires that your permalinks are set to /%postname%/</strong>' );

    }
}

Sie können diese Funktion folgendermaßen verwenden, um beim Paginieren Ihrer benutzerdefinierten Abfrage den Link für jede Seite auf der einzelnen Seite abzurufen

get_single_pagination_link( 'pagenumber_of_previous_or_next_page' );

Wie gesagt, es gibt keine Paginierungsfunktion, mit der Sie Ihre benutzerdefinierten Abfragen paginieren oder Seitenzahlen von der URL lesen können. Sie müssen also Ihre eigenen schreiben.

Hier ist meine Idee, Links zu den nächsten und vorherigen Seiten in Ihrer benutzerdefinierten Abfrage zu erstellen. Wenn Sie genau hinschauen, werden Sie sehen, wie ich die zuvor deklarierte Funktion get_single_pagination_link() verwendet habe, um die Links zu den nächsten und vorherigen Seiten zu erhalten

function get_next_single_page_link ( $label = null, $max_page = 0 ) {
    global $wp_query;

    if ( !$max_page ) {
        $max_page = $wp_query->max_num_pages;
    }

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

    if( is_singular() ) {

        $next_page = intval($paged) + 1;

        if ( null === $label ) {
            $label = __( 'Next Page &raquo;' );
        }

        if ( ( $next_page <= $max_page ) ) {
            return '<a href="' . get_single_pagination_link( $next_page ) . '">' . $label . '</a>';
        }

    }
}

function get_previous_single_page_link( $label = null ) {

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

    if( is_singular() ) {

        $prev_page = intval($paged) - 1;

        if ( null === $label ) {
            $label = __( '&laquo; Previous Page' );
        }

        if ( ( $prev_page > 0 ) ) {
            return '<a href="' . get_single_pagination_link( $prev_page ) . '">' . $label . '</a>';
        }

    }

}

Sie können diese beiden Funktionen jetzt in Ihrem Code verwenden, um Ihre benutzerdefinierte Abfrage zu paginieren. Beide Funktionen funktionieren genauso wie get_next_posts_link() und get_previous_posts_link() und verwenden dieselben genauen Parameter. Sie müssen also berücksichtigen, dass Sie den Parameter $max_page für Ihre benutzerdefinierte Abfrage übergeben müssen

Hier ist Ihre benutzerdefinierte Abfrage mit diesen Funktionen.

function get_related_author_posts() {

    global $authordata, $post;

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

    $args = array( 
        'posts_per_page'    => 2,
        'paged'             => $paged
    );
    $authors_posts = new WP_Query( $args );

    $output = '';

    if( $authors_posts->have_posts() ) {

        $output = '<ul>';

        while( $authors_posts->have_posts() ) {
            $authors_posts->the_post();

            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a>' . get_the_excerpt() . '</li>';

        }

        $output .= '</ul>';

        $output .= get_previous_single_page_link();
        $output .= get_next_single_page_link( null , $authors_posts->max_num_pages );

        wp_reset_postdata();
    }

    return $output;

}
2
Pieter Goosen