Skip to content

ねんでぶろぐ

twitter facebook rss
WordPress Fudousan Plugin for Real Estate
  • TopPage >
  • WordPress >
  • WordPress ユーザーごとに投稿数を制限する

WordPress ユーザーごとに投稿数を制限する

Posted on 2015年8月5日 Update 2015年10月25日 by admin

main_userlimit
記事を投稿できるアカウント( 主に「投稿者」として )を複数のユーザーに渡しているが、それぞれの投稿数の上限を設定したいって言われた事ありませんか?
そんな時は以下のコードを my-plugin.php に張り付けてみてください。

 

管理者は「投稿者」「寄稿者」「編集者」のユーザーごとに投稿数の上限を設定して、上限になるとメッセージを表示して「新規投稿」できなくなります。
post_limit9
投稿数にカウントされるのは「公開済み」「下書き」「非公開」「レビュー待ち (保留中)」「ゴミ箱」「予約投稿 」になります。

 
 

コード

if ( !class_exists( 'Nendebcom_Posts_Limit_Over_Warning' ) ):

	/*
	 * 投稿数制限
	 * @package WordPress4.2
	 *
	 * License: GPLv2 or later
	 */

	class Nendebcom_Posts_Limit_Over_Warning {

		private $default_posted_upper_limit = 10; //最大投稿数(デフォルト)

		public function __construct() {
			add_action( 'admin_init', array( $this, 'posts_limit_over_warning' ) );

			add_action( 'personal_options_update', array( $this, 'save_post_limit_profile_fields' ) ); //My Profile Update.
			add_action( 'edit_user_profile_update', array( $this, 'save_post_limit_profile_fields' ) ); //Other Users Profile Update.
			add_action( 'personal_options', array( $this, 'add_post_limit_profile_fields' ) );  //Add Post limit in User Profile Fields.
		}

		public function posts_limit_over_warning() {

			global $wpdb;
			global $pagenow;
			global $user_ID; //ログインしているユーザーID

			global $current_user;

			if ( $user_ID && isset( $current_user->roles[ 0 ] ) && ( $current_user->roles[ 0 ] == 'contributor' //contributor 寄稿者
			|| $current_user->roles[ 0 ] == 'author'  //author 投稿者
			|| $current_user->roles[ 0 ] == 'editor'  //editor 編集者
			)
			) {

				$sql  = "SELECT COUNT(*)";
				$sql .= " FROM $wpdb->posts AS P";
				$sql .= " WHERE ";
				$sql .= " (  P.post_status='publish'";  //公開済み 
				$sql .= " OR P.post_status='draft'";  //下書き 
				$sql .= " OR P.post_status='private'";  //非公開
				$sql .= " OR P.post_status='pending'";  //レビュー待ち (保留中)
				$sql .= " OR P.post_status='trash'";  //ゴミ箱
				$sql .= " OR P.post_status='future'";  //予約投稿 
				//$sql .= " OR P.post_status='attachment'";	//
				//$sql .= " OR P.post_status='inherit'";	//継承(添付ファイル、改訂履歴・自動保存のとき) 
				$sql .= " )";
				$sql .= " AND P.post_type ='post' ";
				$sql .= $wpdb->prepare( ' AND P.post_author = %d', $user_ID );
				$post_count	 = $wpdb->get_var( $sql );

				//ユーザーの最大投稿数
				$posted_upper_limit = get_user_meta( $user_ID, 'user_post_limit', true );
				if ( $posted_upper_limit == '' ) {
					$posted_upper_limit = $this->default_posted_upper_limit;
				}

				if ( $posted_upper_limit != 0 && $post_count >= $posted_upper_limit ) {

					//物件新規登録ページを非表示
					if ( !isset( $_GET[ 'post_type' ] ) && $pagenow == 'post-new.php' ) {
						wp_die( '投稿の新規登録はできません。' );
					}

					//管理サブメニューから投稿の「新規追加」を削除
					global $submenu;
					unset( $submenu[ 'edit.php' ][ 10 ] ); // 新規追加
					//お知らせ 投稿一覧と投稿編集ページで表示
					if ( $pagenow == 'edit.php' || $pagenow == 'post.php' ) {
						add_action( 'admin_notices', array( $this, 'post_over_notices' ) );
					}

					//ヘッダの「+新規」ドロップダウンメニューから[投稿]を削除
					add_action( 'admin_bar_menu', array( $this, 'remove_admin_bar_menu' ), 202 );

					//投稿一覧ページで h1タイトル 横の[新規追加]ボタンを非表示 CSS
					add_action( 'admin_print_styles-edit.php', array( $this, 'edit_post_page_style' ), 90 );

					//投稿編集ページで h1タイトル 横の「物件登録」ボタンを非表示 CSS
					add_action( 'admin_print_styles-post.php', array( $this, 'edit_post_page_style' ) );

					//remove a button in the post/page edit screen to create a clone
					remove_action( 'post_submitbox_start', 'duplicate_post_add_duplicate_post_button' );

					//remove the link to action list for post_row_actions
					remove_filter( 'post_row_actions', 'duplicate_post_make_duplicate_link_row', 10, 2 );
				}
			}
		}

		/**
		 * Save Post limit in User Profile Fields.
		 *
		 * @param int $user_id
		 */
		public function save_post_limit_profile_fields( $user_id ) {
			global $current_user;
			if ( $current_user->roles[ 0 ] == 'administrator' ) { //administrator 管理者
				$num = isset( $_POST[ 'user_post_limit' ] ) ? $_POST[ 'user_post_limit' ] : '';
				if ( !preg_match( "/^[0-9]+$/", $num ) ) {
					$num = '';
				}
				update_user_meta( $user_id, 'user_post_limit', $num, get_user_meta( $user_id, 'user_post_limit', true ) );
			}
		}

		/**
		 * Add Post limit in User Profile Fields.
		 *
		 * @param array $profileuser
		 */
		public function add_post_limit_profile_fields( $profileuser ) {
			global $current_user;
			if ( $current_user->roles[ 0 ] == 'administrator' ) { //administrator 管理者
				echo '<tr>';
				echo '<th scope="row">投稿数制限</th>';
				echo '<td>最大投稿数 <input type="number" name="user_post_limit" size="4" value="' . get_user_meta( $profileuser->ID, 'user_post_limit', true ) . '" />件 ( 空欄: デフォルト値  0:無制限。) </td>';
				echo '</tr>';
			}
		}

		/**
		 * お知らせ
		 */
		public function post_over_notices() {
			if ( in_array( $GLOBALS[ 'current_screen' ]->post_type, array( 'post' ) ) ) {
				echo '<div class="error" style="text-align: center;"><p>設定の投稿数に達しました。 投稿の新規登録はできません。</p></div>';
			}
		}

		/**
		 * ヘッダの「+新規」ドロップダウンメニューから[投稿]を削除
		 */
		public function remove_admin_bar_menu( $wp_admin_bar ) {
			$wp_admin_bar->remove_menu( 'new-post' );
		}

		/**
		 * 投稿一覧/投稿編集ページで h1タイトル 横の[新規追加]ボタンを非表示 CSS
		 */
		public function edit_post_page_style() {
			if ( in_array( $GLOBALS[ 'current_screen' ]->post_type, array( 'post' ) ) ) {
				?>
				<style type="text/css">
					#wpbody .wrap h1 > a.page-title-action{ display:none; }
				</style>
				<?php

			}
		}

	}

	if ( is_admin() ) {
		new Nendebcom_Posts_Limit_Over_Warning();
	}
endif;

 

初期値

以下の値を利用する環境にあわせて変更してください。

最大投稿数(デフォルト)

private $default_posted_upper_limit = 10;	//最大投稿数(デフォルト)

 各ユーザーごとの最大投稿数を設定をしていない場合は ここのデフォルト値になります。

 

スポンサードリンク



 

画面説明

ユーザープロフィール画面

通常はデフォルト値ですが、ユーザーごとに投稿数の上限を変更する事もできます。
各ユーザーのプロフィール画面では 最大投稿数の設定は 管理者だけが表示され、変更できます。
ユーザー編集

投稿一覧

各ユーザーは投稿数の上限に達すると ヘッダーにメッセージが表示されて「新規追加」のボタンがなくなります。
投稿一覧
投稿一覧 制限中

投稿編集

投稿数の上限に達すると ヘッダーにメッセージが表示されて「新規追加」のボタンがなくなります。
投稿編集
投稿編集 制限中

メニュー

投稿数の上限に達するとサブメニューの「新規追加」のリンクと ヘッダー「+新規」のプルダウン部分の「投稿」リンクがなくなります。
新規投稿メニュー

新規投稿

新規投稿が制限されると新規投稿のページへ行っても投稿することはできません。
post_limit8

※今回は投稿数制限する部分だけ説明しました。

 
 

参考

WordPress Codex ユーザーの種類と権限
http://wpdocs.osdn.jp/ユーザーの種類と権限

WordPress Codex Plugin API/Action Reference/admin init
http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init

WordPress Codex Plugin API/Action Reference/personal options update
https://codex.wordpress.org/Plugin_API/Action_Reference/personal_options_update

WordPress Codex Plugin API/Action Reference/edit user profile update
https://codex.wordpress.org/Plugin_API/Action_Reference/edit_user_profile_update

WordPress Codex Plugin API/Action Reference/personal options
https://codex.wordpress.org/Plugin_API/Action_Reference/personal_options

WordPress Codex Plugin API/Action Reference/admin notices
https://codex.wordpress.org/Plugin_API/Action_Reference/admin_notices

WordPress Code Reference do_action ( “admin_print_styles-{$hook_suffix}” )
https://developer.wordpress.org/reference/hooks/admin_print_styles-hook_suffix/




スポンサードリンク



Posted in WordPressTagged admin_init, admin_notices, admin_print_styles-$hook_suffix, edit_user_profile_update, personal_options, personal_options_update

投稿ナビゲーション

← RSS Footer が使えなくなったのでRSSフィードに署名とリンクを追加するコードを作りました。
WordPress 長い間、投稿していないユーザー(管理者、編集者、投稿者)にメールを送る →

関連記事

WordPress 6.8 をチェックしています

WordPress6.8 RC1 が 公開されました。 WordPress6.8 は 2025年4月15日に リリースされる予定なので いろいろチェックをしています。 その中の WordPress6.8 で気がついたところを取り上 ...

WordPress6.7 をチェックしています

WordPress6.7 RC1 が 公開されました。 WordPress6.7 は 2024年11月12日に リリースされる予定なので いろいろチェックをしています。 その中の WordPress6.7 で気がついたところを取り ...

WordPress 6.6 をチェックしています

WordPress6.6 RC1 が 公開されました。 WordPress6.6 は 2024年7月16日に リリースされる予定なので いろいろチェックをしています。 その中の WordPress6.6 で気がついたところを取 ...

WordPress 6.5 をチェックしています

WordPress6.5 RC1 が 公開されました。 WordPress6.5 は 2024年3月26日に リリースされる予定なので いろいろチェックをしています。 その中の WordPress6.5 で気がついたところを取り上 ...

WordPress6.4 を チェックしています

WordPress6.4 RC1 が 公開されました。 WordPress6.4 は 2023年11月07日に リリースされる予定なので いろいろチェックをしています。 その中の WordPress6.4 で気がついたところを取り ...


スポンサードリンク

カテゴリー

  • WordPress
  • その他
  • セキュリティ
  • テーマ
  • プラグイン

Recent Posts

  • WordPress 6.8 をチェックしています
  • WordPress6.7 新デフォルトテーマ Twenty Twenty-Five をチェックしています
  • WordPress6.7 をチェックしています
  • WordPress 6.6 をチェックしています
  • WordPress 6.5 をチェックしています
  • WordPress6.4 を チェックしています
  • WordPress6.4 新デフォルトテーマ Twenty Twenty-Four をチェックしています
  • WordPress 6.3 を チェックしています

タグクラウド

activated_plugin activate_tinymce_for_media_description add_meta_boxes add_options_page add_theme_support admin_body_class admin_email_check_interval admin_enqueue_scripts admin_footer-$hook_suffix admin_head-$hook_suffix admin_init admin_menu admin_notices admin_print_styles-$hook_suffix after_setup_theme allowed_block_types_all appearance-tools appearanceTools apply_filters apply_shortcodes blockEditor.useSetting.before block_categories_all block_core_navigation_listable_blocks block_core_navigation_render_inner_blocks block_editor_settings_all bulk_actions-{screen_id} bulk_edit_custom_box bulk_edit_posts comment_form_after_fields compare_key Contact Form 7 custom-spacing customize_register customize_save_after date_i18n default-font-sizes default-spacing-sizes deleted_post_{$post->post_type} delete_post_{$post->post_type} delete_user delete_user_form deprecated_function_trigger_error document_title_parts document_title_separator editor_script_handles editor_style_handles edit_user_profile_update Embed embed_head embed_template embed_thumbnail_image_shape embed_thumbnail_image_size emoji enqueue_block_editor_assets fluid Fluid typography Fonts API Footnotes get_category_parents get_currentuserinfo get_file_data get_option get_parent_post get_parent_theme_file_path get_parent_theme_file_uri get_permalink get_query_template get_term_parents_list get_theme_file_path get_theme_file_uri get_the_content get_the_post_thumbnail get_the_title get_users Google APPs Google Fonts Google Maps Gutenberg has_post_parent has_post_thumbnail hooked_block/hooked_block_{$block_type} illegal_user_logins init is_admin_screen is_customize_preview is_post_status_viewable is_post_type_viewable is_singular is_user_logged_in jQuery Lazy-Loading login_footer login_form login_init login_site_html_link Masonry max-image-preview my-plugin new_admin_email_subject paginate_links_output password_hint personal_options personal_options_update phpmailer_init plugins_list plugin_row_meta post_password_expires post_password_required post_search_columns post_thumbnail_id post_thumbnail_url pre_comment_on_post pre_get_document_title pre_months_dropdown_query pre_wp_mail pre_wp_unique_post_slug prime_options prime_options_by_group protected_title_format quick_edit_dropdown_authors_args RECOVERY_MODE_EMAIL registered_post_type_{$post_type} registered_taxonomy_{$taxonomy} register_block_template.unregister_block_template register_form register_post register_sidebar register_{$post_type}_post_type_args register_{$taxonomy}_taxonomy_args registration_errors render_block_core_navigation_link_allowed_post_status render_block_{$this->name} rest_after_insert_attachment safecss_filter_attr sanitize_file_name script_handles script_loader_tag ServerSideRender site_search_columns site_status_autoloaded_options_action_to_perform site_status_autoloaded_options_limit_description site_status_autoloaded_options_size_limit skipBlockSupportAttributes style_handles templateLock template_redirect theme.json the_content the_custom_header_markup the_excerpt_embed the_excerpt_rss the_password_form the_post_navigation Twenty Eleven Twenty Fifteen Twenty Fourteen Twenty Nineteen Twenty Seventeen Twenty Sixteen Twenty Ten Twenty Thirteen Twenty Twelve Twenty Twenty Twenty Twenty-Fiver Twenty Twenty-Four Twenty Twenty-One Twenty Twenty-Three Twenty Twenty-Two TwitterAPI Update URI update_option upgrader_source_selection user_profile_update_errors user_search_columns view_script_handles WordPress4.1 WordPress4.2 WordPress4.3 WordPress4.4 WordPress4.5 WordPress4.6 WordPress4.7 WordPress4.8 WordPress4.9 WordPress5.0 WordPress5.1 WordPress5.2 WordPress5.3 WordPress5.4 WordPress5.5 WordPress5.6 WordPress5.7 WordPress5.8 WordPress5.9 WordPress6.0 WordPress6.1 WordPress6.2 WordPress6.3 WordPress6.4 WordPress6.5 WordPress6.6 WordPress6.7 WordPress6.8 wpcf7_form_tag WP Fastest Cache WP Multibyte Patch wp_add_inline_script wp_admin_canonical_url wp_after_insert_post wp_autoload_values_to_autoload wp_body_open wp_cache_set wp_content_img_tag wp_create_nonce wp_date WP_DEBUG_LOG wp_default_autoload_value wp_dequeue_script_module wp_dequeue_style wp_deregister_script_module wp_deregister_style WP_DEVELOPMENT_MODE wp_editor_set_quality wp_enqueue_script wp_enqueue_scripts wp_enqueue_script_module wp_enqueue_style wp_filesystem wp_footer wp_get_attachment_image wp_get_custom_css wp_get_document_title wp_head WP_HTML_Tag_Processor wp_is_block_template_theme wp_is_block_theme wp_is_rest_endpoint wp_mail wp_max_autoloaded_option_siz wp_omit_loading_attr_threshold wp_plugin_dependencies_slug wp_print_styles wp_register_script wp_register_script_module wp_replace_insecure_home_url wp_resource_hints wp_script_modules wp_set_options_autoload wp_set_option_autoload wp_targeted_link_rel wp_theme_files_cache_ttl wp_title wp_verify_nonce writingMode XAMPP _wp_render_title_tag {$adjacent}_post_link {$type}_template サイトエディタ フルサイト編集(FSE)
はざくみ イラストブログ

Proudly powered by WordPress | Theme: nendebcom by nendeb. | Privacy Policy