it-swarm.com.de

Beitrag nach Attributen sortieren 'bestellen'

Wie sortiere ich die angezeigten Beiträge nach dem Attribut "Reihenfolge"?

In functions.php habe ich die "Attribute" für Beiträge hinzugefügt

function wpzen_add_attributes_to_post() {
    add_post_type_support('post', 'page-attributes');
}
add_action('init', 'wpzen_add_attributes_to_post');
function wpzen_change_post_order($query) {
    if($query->is_main_query()) {
        $query->set('orderby', 'menu_order');
    }
}
add_action('pre_get_posts', 'wpzen_change_post_order');

Der Code zeigt eine Übersicht der Beiträge wie folgt an:

<?php
        $show_posts = '12';
        $cat_name = 'Products';
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $my_query = new WP_query('category_name=' . $cat_name . '&showposts=' . $show_posts . '&paged=' . $paged );

        global $wp_query;
        $wp_query->in_the_loop = true;

        while ($my_query->have_posts()) : $my_query->the_post();
        $do_not_duplicate = $post->ID;?>

    <a href="<?php echo get_permalink(); ?>">
        <h2><?php the_title(); ?></h2>
    </a>
    <?php the_content( $more_link_text , $strip_teaser ); ?>

<?php endwhile; ?>

So sortieren Sie Beiträge nach dem Attribut "Reihenfolge" (aufsteigend oder absteigend).

4
Lech

Nun, ich fürchte, es wird nicht so funktionieren. Lassen Sie mich erklären, warum ...

In Ihrer wpzen_change_post_order Funktion prüfen Sie, ob $query->is_main_query(). Um genau zu sein, wird überprüft, ob es sich bei der angegebenen Abfrage um eine Hauptabfrage für die aktuelle Seite handelt - die von WP generierte Abfrage, um Standardbeiträge für die aktuelle Seite anzuzeigen.

Wenn Sie also ein eigenes WP_Query-Objekt erstellen, ist diese Bedingung falsch und Ihre Funktion setzt den Parameter orderby nicht.

Wie kann man das ändern?

Es gibt verschiedene Möglichkeiten, dies zu beheben. Erstens: Entfernen Sie die if-Anweisung aus wpzen_change_post_order. Aber dann sollten Sie vorsichtig sein und einige andere Prüfungen hinzufügen, damit Sie sicher sein können, dass Sie nur die Abfragen ändern, die Sie wirklich möchten. (Insbesondere sollten Sie überprüfen, if ( ! is_admin() ))

Zweiter Weg, viel einfacher, denke ich ... Füge orderby Parameter direkt in deinen WP_Query ein. Der Code, der Posts anzeigt, sieht also folgendermaßen aus:

<?php
        $show_posts = '12';
        $cat_name = 'Products';
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $my_query = new WP_Query( array(  // <- It's better to use array
           'category_name' => $cat_name,
           'posts_per_page' => $show_posts,  // <- showposts is deprecated for long time, so use posts_per_page instead
           'paged' => $paged,
           'orderby' => 'menu_order'
        ) );

        global $wp_query;  // <- I'm not sure what do you want to accomplish with these 2 lines
        $wp_query->in_the_loop = true;

        while ($my_query->have_posts()) : $my_query->the_post();
        $do_not_duplicate = $post->ID;?>

    <a href="<?php echo get_permalink(); ?>">
        <h2><?php the_title(); ?></h2>
    </a>
    <?php the_content( $more_link_text , $strip_teaser ); ?>

<?php endwhile; ?>
2