HEX
Server: nginx/1.22.1
System: Linux VM-16-9-centos 3.10.0-1160.99.1.el7.x86_64 #1 SMP Wed Sep 13 14:19:20 UTC 2023 x86_64
User: www (1001)
PHP: 7.3.31
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/softfox.com.cn/wp-content/plugins/wpjam-basic/extends/wpjam-posts-per-page.php
<?php
/*
Name: 文章数量
URI: https://mp.weixin.qq.com/s/gY0AG1vnR285bmOfKO8SCw
Description: 文章数量扩展可以设置不同页面不同的文章列表数量和文章类型,也可开启不同的分类不同文章数量。
Version: 1.0
*/
class WPJAM_Posts_Per_Page extends WPJAM_Option_Model{
	public static function sanitize_callback($value){
		foreach (['posts_per_page', 'posts_per_rss'] as $option_name) {
			if(isset($value[$option_name])){
				if($value[$option_name]){
					update_option($option_name, $value[$option_name]);
				}

				unset($value[$option_name]);
			}
		}
	}

	public static function get_fields(){
		$fields	= [];

		$fields['posts_per_page']	= ['title'=>'全局',	'type'=>'number',	'value'=>get_option('posts_per_page'),	'description'=>'博客全局设置的文章列表数量,空或者0则使用全局设置'];

		$pt_objects = get_post_types(['exclude_from_search'=>false, '_builtin'=>false], 'objects');

		if($pt_objects){
			$options		= ['post'=>'文章']+wp_list_pluck($pt_objects, 'label');
			$number_field 	= ['title'=>'文章数量',	'type'=>'number'];
			$ptype_field 	= ['title'=>'文章类型',	'type'=>'checkbox',	'value'=>['post'],	'options'=>$options];

			$fields['posts_per_rss_set']	= ['title'=>'Feed页',	'type'=>'fieldset',	'fields'=>[
				'posts_per_rss'				=> $number_field+['value'=>get_option('posts_per_rss')],
				'posts_per_rss_post_types'	=> $ptype_field,
			]];

			$fields['home_set']	= ['title'=>'首页',	'type'=>'fieldset',	'fields'=>[
				'home'				=> $number_field,
				'home_post_types'	=> $ptype_field,
			]];
		}else{
			$fields['posts_per_rss']	= ['title'=>'Feed页',	'type'=>'number',	'value'=>get_option('posts_per_rss'),	'description'=>'Feed中最近文章列表数量'];

			$fields['home']	= ['title'=>'首页',	'type'=>'number'];
		}

		foreach(['author'=>'作者页','search'=>'搜索页','archive'=>'存档页'] as $page_key=>$page_name){
			$fields[$page_key]	= ['title'=>$page_name,	'type'=>'number'];
		}

		$tax_objects	= get_taxonomies(['public'=>true,'show_ui'=>true], 'objects');

		if($tax_objects){
			$sub = [];

			foreach(wp_list_sort($tax_objects, 'hierarchical', 'DESC', true) as $taxonomy=>$tax_object){
				if(wpjam_get_taxonomy_setting($taxonomy, 'posts_per_page')){
					continue;
				}

				$sub[$taxonomy] = ['title'=>$tax_object->label,	'type'=>'number',	'group'=>$taxonomy];

				if($tax_object->hierarchical){
					$sub[$taxonomy.'_individual']	= ['type'=>'checkbox',	'description'=>'每个'.$tax_object->label.'可独立设置数量',	'group'=>$taxonomy];
				}
			}

			$fields['tax_set']	= ['title'=>'分类模式',	'type'=>'fieldset',	'fields'=>$sub];
		}

		$pt_objects	= get_post_types(['public'=>true, 'has_archive'=>true], 'objects');

		if($pt_objects){
			$sub = [];

			foreach($pt_objects as $post_type=>$pt_object){
				$sub[$post_type]	= ['title'=>$pt_object->label,	'type'=>'number'];
			}

			$fields['post_type_set']	= ['title'=>'文章类型',	'type'=>'fieldset',	'fields'=>$sub];
		}

		return $fields;
	}

	public static function get_menu_page(){
		return [
			'tab_slug'		=> 'posts-per-page',
			'function'		=> 'option',	
			'option_name'	=> 'wpjam-posts-per-page',
			'plugin_page'	=> 'wpjam-posts',
			'order'			=> 18,
			'summary'		=> __FILE__
		];
	}

	public static function get_admin_load(){
		return [
			'base'	=> 'edit-tags',
			'model'	=> self::class
		];
	}

	public static function filter_row_actions($actions, $term){
		if($posts_per_page = get_term_meta($term->term_id, 'posts_per_page', true)){
			$actions['posts_per_page']	= str_replace('>文章数量<', '>文章数量'.'('.$posts_per_page.')'.'<', $actions['posts_per_page']);
		}

		return $actions;
	}

	public static function builtin_page_load($screen){
		if(is_taxonomy_hierarchical($screen->taxonomy) && self::get_setting($screen->taxonomy.'_individual')){
			$default	= self::get_setting($screen->taxonomy) ?: get_option('posts_per_page');

			wpjam_register_list_table_action('posts_per_page',[
				'title'			=> '文章数量',
				'page_title'	=> '设置文章数量',
				'submit_text'	=> '设置',
				'width'			=> 400,
				'fields'		=> [
					'default'			=> ['title'=>'默认数量',	'type'=>'view',		'value'=>$default],
					'posts_per_page'	=> ['title'=>'文章数量',	'type'=>'number',	'class'=>'']
				]
			]);

			add_filter($screen->taxonomy.'_row_actions', [self::class, 'filter_row_actions'], 10, 2);	
		}
	}

	public static function on_pre_get_posts($wp_query) {
		if(!$wp_query->is_main_query()){
			return;
		}

		if(isset($wp_query->query['post_type'])){
			$required	= false;
		}else{
			$required	= (bool)get_post_types(['exclude_from_search'=>false, '_builtin'=>false], 'objects');
		}

		if(is_front_page()){
			$number	= self::get_setting('home');
			
			if($required){
				$post_types	= self::get_setting('home_post_types');
			}
		}elseif(is_feed()){
			if($required){
				$post_types	= self::get_setting('feed_post_types');
			}
		}elseif(is_author()){
			$number	= self::get_setting('author');

			if($required){
				$post_types	= get_post_types_by_support('author');
				$post_types	= array_intersect($post_types, get_post_types(['public'=>true]));
			}
		}elseif(is_tax() || is_category() || is_tag()){
			$term	= $wp_query->get_queried_object();

			if($term){
				$taxonomy	= $term->taxonomy;
				$number		= self::get_setting($taxonomy);
				$individual	= self::get_setting($taxonomy.'_individual');

				if($individual && metadata_exists('term', $term->term_id, 'posts_per_page')){
					$number	= get_term_meta($term->term_id, 'posts_per_page', true);
				}

				if(is_category() || is_tag()){
					$post_types	= get_taxonomy($taxonomy)->object_type;
					$post_types	= array_intersect($post_types, get_post_types(['public'=>true]));
				}
			}
		}elseif(is_post_type_archive()){
			$pt_object	= $wp_query->get_queried_object();
			$number		= self::get_setting($pt_object->name);
		}elseif(is_search()){
			$number		= self::get_setting('search');
		}elseif(is_archive()){
			$number		= self::get_setting('archive');
			$post_types	= 'any';
		}

		if(!empty($number)){
			$wp_query->set('posts_per_page', $number);
		}

		if($required && !empty($post_types)){
			if(is_array($post_types) && count($post_types) == 1) {
				$post_types	= $post_types[0];
			}

			$wp_query->set('post_type', $post_types);
		}
	}

	public static function add_hooks(){
		if(!is_admin()){
			add_action('pre_get_posts',  [self::class, 'on_pre_get_posts']);
		}
	}
}

wpjam_register_option('wpjam-posts-per-page',	['model'=>'WPJAM_Posts_Per_Page', 'title'=>'文章数量']);