web-dev-qa-db-ja.com

カスタムポストタイプアーカイブへのスティッキー機能の追加

WordPressでは、カスタム投稿タイプにはコア機能としてスティッキー機能がありません。確かに、特定の場合に作成することは可能です。そして、archive-{customposttype}.phpテンプレートにそれを必要とするプロジェクトに取り組んでいます。

Sticky Custom Post Types と呼ばれるプラグインをダウンロードしてインストールしました。このプラグインは この記事で 少しのPHPとともに使用できますget_option( 'sticky_posts')に移動し、現在実行されているクエリの配列を再構成します。

ループ内でif (!is_sticky()) {et cetera}を使用すると、スティッキー(カスタム投稿タイプ)投稿の出力を変更できるため、プラグインが機能することを知っています。

記事のコードを正常に実装することができませんでした。archive-{customposttype}.phpテンプレートの一番上に配置しても、順序がまったく変わらないように見えますし、機能させることもできません。他のいくつかの試みを通じて。これはおそらく、私がPHPにあまり精通していないためです。

もう1つ試したのは、新しいクエリを作成して、固定投稿のみを表示するように指定することです(固定投稿のみを表示するようにしました)。そのクエリを変数に保存してからwp_reset_query()を呼び出してから、Ido n'tがスティッキーな投稿を望んでいないことを指定する別のクエリを作成して、 _wp_reset_query()を再度呼び出して変数に保存します。そして、2つのクエリ配列をarray_merge()とマージします。残念ながら、これの私のさまざまな実装は、ページを壊したか、まったく何もしないことに成功したか、2番目のクエリの出力のみを表示しました...そして、私はそれらを軽cornから削除しました。

本当に正しい方法でこれを行っているかどうかはわかりません。そして、多くの人々がこの問題に立ち向かい、克服したと確信しています。この機能の実装を支援するアドバイスやコードスニペットをお持ちの方は大歓迎です。

わかりやすくするために繰り返しますが、カスタム投稿タイプのアーカイブページの上部にスティッキーな投稿を表示しようとしています。

2
aminimalanimal

あなたの質問に対する答えは次のWebページにあると思います。

その作者(Tareq Hasan)は、私たちと同じ問題に直面し、解決策を見つけました。

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

基本的に、あなたはすでに持っているプラ​​グインをインストールする必要があります(スティッキーカスタム投稿タイプ):そしてフィルタを追加します:

プラグインはかなり古いですが、それが動作する方法で非常に単純ですので、それはまだWordPress 4.2で完全に動作します。以下のコードスニペットも同様です。

それは私を助けたようにそれがあなたを助けることを願っています。

/**
 * 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

2つのカスタム投稿タイプでスティッキー投稿を実装しています。ここで言及しているプラ​​グインを見ただけです。これはWordpressがスティッキポストを識別するために使用するスティッキポストグローバルオプションを使用します - 私がコードで見ることができる限り、それはホームページにカスタムポストタイプをスティッキにします。あなたのアーカイブページであなたがする必要があるのは:

付箋を取得

$sticky = get_option( 'sticky_posts' );

あなたの投稿タイプのスティッキー投稿のみを取得するためにクエリを使用して、それからページのトップにそれらを出力する

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

次に、メインクエリを修正してスティッキポストを除外します。

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