あのときコード

カスタム投稿の1ページ当たりの表示件数設定

wordpress カスタムポスト post_type 一覧 件数

1.初期値設定

/*** 初期値 ***/
function get_def_post_per_page($post_type = '') {

    $def = array(
        'custom_post' => 10,
    );

    if($post_type) {
        return $def[$post_type];
    } else {
        return $def;
    }
}

2.クエリ調整

/*** クエリ調整 ***/
function change_posts_per_page($query) {
    if ( is_admin() || !$query->is_main_query() ) return;

    if(is_archive() || is_tax()) {

        if(is_tax()) {
            $term = get_queried_object();
            $taxonomy = $term->taxonomy;
            $post_type = get_taxonomy($taxonomy)->object_type[0];
        } else {
            $post_type = get_query_var('post_type');
        }

        if($post_type) {
            $cnt = get_option($post_type . '_cnt');

            if(!$cnt) {
                $cnt = get_def_post_per_page($post_type);
            }
            $query->set( 'posts_per_page', $cnt ); //表示件数を指定
        }

    }

}
add_action( 'pre_get_posts', 'change_posts_per_page' );

3.管理画面設定

/*** 保存件数データ取得 ***/
function get_post_per_page($post_type) {
    $def_post_per_page = get_def_post_per_page();

    $cnt = get_option($post_type . '_cnt');
    
    if(!isset($cnt) || $cnt == '') {
        $cnt = $def_post_per_page[$post_type];
    }

    return $cnt;
}

/*** 設定→表示設定に項目追加 ***/
function add_reading_post_per_page() {
    $def_post_per_page = get_def_post_per_page();

    foreach($def_post_per_page as $key => $value) {
        $post_obj = get_post_type_object($key);
        add_settings_field($key . '_cnt', '1ページに表示する最大投稿数【' . $post_obj->labels->name . '】', 'get_post_per_page_field', 'reading', 'default', array('post_type' => $key) );
    }
}
add_action( 'admin_init', 'add_reading_post_per_page' );
 
function get_post_per_page_field( $args ) {
    $post_per_page = get_post_per_page($args['post_type']);
?>
    <input id="<?php echo $args['post_type'] ?>_cnt" name="<?php echo $args['post_type'] ?>_cnt" type="number" step="1" min="1" value="<?php echo esc_html( $post_per_page ); ?>" class="small-text">
<?php

}