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');
必要ないかもしれませんが、念のため、オリジナルのアクションフックのほうは削除しておきます。