WordPress「最新の投稿」に先頭固定表示

WordPressの「最新の投稿」ブロックでは、「ブログのトップに固定」を指定してもトップに表示されません。「最新の投稿」ブロックをカスタマイズして、先頭固定表示することができました。

ただし、カテゴリーを指定すると先頭固定表示がきかなくなります。不具合じゃないのかな?

まず、「最新の投稿」のファイルを調べます。パスは wp-includes/blocks/latest-posts.php です。

/**                                                                                                 
 * Renders the `core/latest-posts` block on server.                                                 
 *                                                                                                  
 * @param array $attributes The block attributes.                                                   
 *                                                                                                  
 * @return string Returns the post content with latest posts added.                                 
 */
function render_block_core_latest_posts( $attributes ) {
    global $post, $block_core_latest_posts_excerpt_length;

    $args = array(
        'posts_per_page'      => $attributes['postsToShow'],
        'post_status'         => 'publish',
        'order'               => $attributes['order'],
        'orderby'             => $attributes['orderBy'],
        'ignore_sticky_posts' => true,
        'no_found_rows'       => true,
    );

    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );

    if ( isset( $attributes['categories'] ) ) {
        $args['category__in'] = array_column( $attributes['categories'], 'id' );
    }
    if ( isset( $attributes['selectedAuthor'] ) ) {
        $args['author'] = $attributes['selectedAuthor'];
    }

    $query        = new WP_Query();
    $recent_posts = $query->query( $args );

16行目の ignore_sticky_posts で固定記事を無視するように指定していましたので、function.php にこの関数の16行目だけコメントアウトした my_render_block_core_latest_posts() を定義します。

その前に、latest_posts.php の他の関数を呼び出しているので、requre_once しておきます。

require_once ABSPATH . WPINC . '/blocks/latest-posts.php';
function my_render_block_core_latest_posts( $attributes ) {
                            :

latest-posts.php では register_block_type_from_metadata() でブロックを登録する関数 register_block_core_latest_posts() を定義し、この関数を init アクションフックに登録しています。↓この部分ですね。

/**                                                                                                 
 * Registers the `core/latest-posts` block on server.                                               
 */
function register_block_core_latest_posts() {
    register_block_type_from_metadata(
        __DIR__ . '/latest-posts',
        array(
            'render_callback' => 'render_block_core_latest_posts',
        )
    );
}
add_action( 'init', 'register_block_core_latest_posts' );

これと同じことを function.php にも書いておきます。

function my_register_block_core_latest_posts() {
    register_block_type_from_metadata(
        ABSPATH . WPINC . '/blocks/latest-posts',
        array(
            'render_callback' => 'my_render_block_core_latest_posts',
        )
    );
}

remove_action( 'init', 'register_block_core_latest_posts');
add_action( 'init', 'my_register_block_core_latest_posts');

必要ないかもしれませんが、念のため、オリジナルのアクションフックのほうは削除しておきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です