web-dev-qa-db-ja.com

公開された投稿数に基づいてユーザーの役割を更新する

ユーザーが新しい投稿を公開したときに公開された投稿数に基づいてユーザーの役割を更新しようとしています。私はこのコードを試しましたが、うまくいきません。

    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'); 

        }


    }

?>
1
pixelngrain

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;

    }
1
Chris_O