ユーザーが新しい投稿を公開したときに公開された投稿数に基づいてユーザーの役割を更新しようとしています。私はこのコードを試しましたが、うまくいきません。
add_action('publish_post', 'update_roles');
function update_roles()
{
global $wpdb;
// Get the author
$author = wp_get_current_user();
$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_author = " . $author->ID );
$numPost = count($posts);
// Do the checks to see if they have the roles and if not update them.
if($numPost > 0 && $numPosts <= 2 && current_user_can('subscriber'))
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('contributor');
} elseif ($numPost > 3 && $numPosts <= 5 && current_user_can('contributor'))
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('author');
} elseif ($numPost > 6 && $numPosts <= 9 && current_user_can('author'))
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('author');
}
}
?>
私もこれを試しました、そして、それはまた働いていません。
<?php
add_action('publish_post', 'update_roles');
function update_roles()
{
global $wpdb;
// Get the author
$author = wp_get_current_user();
// Get post by author
$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_author = " . $author->ID );
$numPost = count($posts);
// Do the checks to see if they have the roles and if not update them.
if($numPost > 0 && $numPosts <= 2 && current_user_can('subscriber'))
{
// Remove role
$author->remove_role( 'subscriber' );
// Add role
$author->add_role( 'contributor' );
} elseif ($numPost > 3 && $numPosts <= 5 && current_user_can('contributor'))
{
// Remove role
$author->remove_role( 'contributor' );
// Add role
$author->add_role( 'author' );
} elseif ($numPost > 6 && $numPosts <= 9 && current_user_can('author'))
{
// Remove role
$author->remove_role( 'author' );
// Add role
$author->add_role( 'editor' );
}
}
?>
新しい編集:正しく行ったかどうかを教えてください。
<?php
add_action('publish_post', 'update_roles');
function update_roles()
{
global $wpdb;
// Get the author
$author = wp_get_current_user();
// Get post by author
$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_author = " . $author->ID );
$numPost = count($posts);
// Do the checks to see if they have the roles and if not update them.
if ($numPost > 3 && $numPosts <= 5 && array_key_exists( 'contributor', $old_role ) )
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('author');
} elseif ($numPost > 6 && $numPosts <= 9 && array_key_exists( 'author', $old_role ) )
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('editor');
}
}
?>
current_user_can()
は ケーパビリティ をチェックします。例えば:edit_posts、ロールではありません。購読者が持っている唯一の機能は、自分のプロファイルを変更するためのダッシュボードへのアクセスを許可するだけです(追加の上限を追加しない限り)。投稿を公開することすらできないので、投稿者から始める必要があります。
$old_role = get_user_meta( $user_id, 'wp_capabilities' );
elseif ($numPost > 3 && $numPosts <= 5 && array_key_exists( 'contributor', $old_role ) )
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('author');
} elseif ($numPost > 6 && $numPosts <= 9 && array_key_exists( 'author', $old_role ) )
{
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('author');
}
私たちがしていることは、usermetaテーブルからwp_capabilitiesの値を取得するためにget_user_meta()
を使うことです。そのフィールドの値は配列なので、Array([contributor] => 1)
ロールはそのロールがそのユーザーに存在するかどうかをチェックするために php array_key_exists() 関数を使用できるキーの1つです。これに加えて、カスタムSQLを実行する代わりに、 count_user_posts()
関数を使用して、投稿数。
更新:これは完全にテストされ動作しています。
add_action( 'save_post', 'update_roles' );
function update_roles( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Get the author
$author = wp_get_current_user();
// Set variables for current user information
$count = count_user_posts( $author->ID );
$current_role = (array) get_user_meta( $author->ID, 'wp_capabilities' );
// Do the checks to see if they have the roles and if not update them.
if ( ( $count > 3 && $count <= 5 ) && ( array_key_exists( 'contributor', $current_role[0] ) ) ) {
$user_id_role = new WP_User( $author->ID );
$user_id_role->set_role( 'author' );
} elseif ( ( $count > 6 && $count <= 9 ) && ( array_key_exists( 'author', $current_role[0] ) ) ) {
$user_id_role = new WP_User( $author->ID );
$user_id_role->set_role( 'editor' );
} return $post_id;
}