it-swarm.com.de

Hinzufügen von Sticky-Funktionen zu benutzerdefinierten Post-Type-Archiven

In WordPress haben benutzerdefinierte Beitragstypen keine Sticky-Funktionalität als Kernfunktion. Ich bin mir sicher, dass es in bestimmten Fällen möglich ist, es zu erstellen - und ich arbeite an einem Projekt, das es für archive-{customposttype}.php-Vorlagen benötigt.

Ich habe ein Plugin namens Sticky Custom Post Types heruntergeladen und installiert, das ich gelesen habe. In diesem Artikel kann zusammen mit ein bisschen PHP verwendet werden, um_option zu erhalten ('sticky_posts') und konfigurieren Sie das Array der aktuell ausgeführten Abfrage neu.

Ich weiß, dass das Plugin funktioniert, weil ich mit if (!is_sticky()) {et cetera} in der Schleife die Ausgabe der Sticky-Posts (benutzerdefinierte Post-Typen) ändern kann.

Ich konnte den Code aus dem Artikel nicht erfolgreich implementieren. Die Reihenfolge scheint sich überhaupt nicht zu ändern, wenn ich ihn oben auf meine archive-{customposttype}.php-Vorlage setze, und ich konnte ihn auch nicht durch mehrere andere Versuche zum Laufen bringen . Das liegt wahrscheinlich daran, dass ich nicht besonders gut mit PHP umgehen kann.

Eine andere Sache, die ich versucht habe, ist das Erstellen einer neuen Abfrage, in der angegeben wird, dass ich nur klebrige Beiträge möchte (was dazu führte, dass mir nur klebrige Beiträge angezeigt wurden). versuche diese Abfrage in einer Variablen zu speichern, dann wp_reset_query() aufzurufen und dann eine weitere Abfrage zu erstellen, die angibt, dass ich nicht Sticky Posts möchte, versuche dies in einer Variablen zu speichern und wp_reset_query() erneut aufzurufen; und dann Zusammenführen der beiden Abfrage-Arrays mit array_merge(). Leider haben meine verschiedenen Implementierungen entweder die Seite gebrochen oder es ist mir gelungen, absolut nichts zu tun, oder ich habe nur die Ausgabe der zweiten Abfrage gezeigt ... und ich habe sie aus Verachtung gelöscht.

Ich weiß nicht, ob ich das überhaupt richtig mache; und ich bin sicher, viele Menschen haben sich mit diesem Problem auseinandergesetzt und es bewältigt. Wenn jemand Ratschläge oder Codefragmente hat, die mir bei der Implementierung dieser Funktion helfen, wäre er sehr dankbar.

Um dies noch einmal zu wiederholen, versuche ich, für benutzerdefinierte Beitragstypen klebrige Beiträge oben auf meinen Archivseiten anzuzeigen.

2
aminimalanimal

Ich denke, die Antwort auf Ihre Fragen liegt auf der folgenden Webseite.

Ihr Autor (Tareq Hasan) stand vor dem gleichen Problem wie wir und fand eine Lösung.

https://tareq.co/2013/01/sticky-posts-in-custom-post-type-archives/

Grundsätzlich müssen Sie das Plugin installieren, das Sie bereits haben (Sticky Custom Post Types) und einen Filter hinzufügen: (Ich füge den Code hier ein, wenn die Seite heruntergekommen ist, haben wir ihn immer noch.)

Das Plugin ist ziemlich alt, aber es funktioniert sehr einfach, sodass es mit WordPress 4.2 immer noch perfekt funktioniert. Gleiches gilt für das unten stehende Code-Snippet.

Hoffe, es hilft dir, wie es mir geholfen hat.

/**
 * Put sticky posts to top at custom post archives
 * Author: Tareq Hasan
 * Source: http://tareq.wedevs.com/2013/01/sticky-posts-in-custom-post-type-archives/
 * 
 * WordPress doesn't do any processing for sticky posts in custom post type archives.
 * It process sticky posts in homepage only (is_home()). This function processes
 * sticky posts at custom post archive page and puts them to the top of list.
 * 
 * @author Tareq Hasan (http://tareq.weDevs.com)
 *
 * @param array $posts array of queried posts
 * @return array
 */
function wedevs_cpt_sticky_at_top( $posts ) {

    // apply the magic on post archive only
    if ( is_main_query() && is_post_type_archive() ) {
        global $wp_query;

        $sticky_posts = get_option( 'sticky_posts' );
        $num_posts = count( $posts );
        $sticky_offset = 0;

        // loop through the post array and find the sticky post
        for ($i = 0; $i < $num_posts; $i++) {

            // Put sticky posts at the top of the posts array
            if ( in_array( $posts[$i]->ID, $sticky_posts ) ) {
                $sticky_post = $posts[$i];

                // Remove sticky from current position
                array_splice( $posts, $i, 1 );

                // Move to front, after other stickies
                array_splice( $posts, $sticky_offset, 0, array($sticky_post) );
                $sticky_offset++;

                // Remove post from sticky posts array
                $offset = array_search($sticky_post->ID, $sticky_posts);
                unset( $sticky_posts[$offset] );
            }
        }

        // Fetch sticky posts that weren't in the query results
        if ( !empty( $sticky_posts) ) {

            $stickies = get_posts( array(
                'post__in' => $sticky_posts,
                'post_type' => $wp_query->query_vars['post_type'],
                'post_status' => 'publish',
                'nopaging' => true
            ) );

            foreach ( $stickies as $sticky_post ) {
                array_splice( $posts, $sticky_offset, 0, array( $sticky_post ) );
                $sticky_offset++;
            }
        }

    }

    return $posts;
}

add_filter( 'the_posts', 'wedevs_cpt_sticky_at_top' );
2

Ich implementiere Sticky-Posts in zwei benutzerdefinierten Post-Typen und habe mir gerade das Plugin angesehen, das Sie hier erwähnen. Es wird die globale Option "Sticky Posts" verwendet, mit der Wordpress Sticky Posts identifiziert. Soweit ich im Code sehen kann, werden benutzerdefinierte Post-Typen auf die Homepage geklebt. Was Sie auf Ihrer Archivseite tun müssen, ist:

Holen Sie sich klebrige Beiträge

$sticky = get_option( 'sticky_posts' );

Verwenden Sie eine Abfrage, um nur Haftnotizen für Ihren Beitragstyp abzurufen, und geben Sie diese dann oben auf der Seite aus

$args = array(
    'posts_type' => [your custom post type slug],
    'post__in'  => $sticky
);
$sticky_query = new WP_Query( $args );
while( $sticky_query->have_posts() ) {
    $sticky_query->next_post();
    echo '<li>' . get_the_title( $sticky_query->post->ID ) . '</li>';
}
wp_reset_postdata();

Ändern Sie anschließend die Hauptabfrage, um die Verwendung von Haftnotizen auszuschließen

query_posts(array('post__not_in' => $sticky))
0
user34211