Статьи

Роли и возможности WordPress: функции заметки

Это учебное пособие из четырех частей, охватывающее тему пользователей, ролей и возможностей WordPress. Серия будет посвящена архитектуре и дизайну пользовательских ролей в WordPress; выделить наиболее важные функции для взаимодействия с пользователями и управления ролями и возможностями; и в последнем уроке мы собираемся создать реальный пример, демонстрирующий полезность этого API.


В первой части мы рассмотрели только теорию о пользователях, ролях и возможностях. Эта часть будет посвящена коду и функциям, которые предлагает WordPress для взаимодействия с этой системой. Очевидно, что мы не собираемся охватывать все функции, которые есть в WordPress, но я попытался перечислить наиболее важные и полезные.

Поскольку изменения и обновления WordPress происходят часто, вы всегда должны возвращаться к документации Кодекса и проверять, изменилось ли что-то. Я предоставлю ссылку на страницу Кодекса для каждой функции, которую мы рассмотрим здесь для вашего удобства.


Пользователи в WordPress отличаются от посетителей. Это люди, которые зарегистрировали аккаунт с уникальным именем пользователя на вашем сайте. Вы можете включить регистрацию новых пользователей на своем сайте из панели «Настройки» -> «Общие», установив флажок «Членство -> Кто угодно может зарегистрироваться».

В этом разделе мы рассмотрим некоторые полезные функции для взаимодействия с зарегистрированными пользователями в WordPress. В вашей новой настройке WordPress должен быть хотя бы один пользователь: тот, кто установил установку WordPress. В старых версиях это был «админ»; однако теперь вы можете выбрать имя пользователя при установке WordPress.

  1. WordPress имеет визуальный интерфейс для создания, обновления и удаления пользователей. Вы должны использовать это большую часть времени. Однако есть случаи, когда вы хотите сделать это с помощью программирования: например, при импорте пользователей из другой среды или если вы создаете свою собственную пользовательскую форму регистрации.

    WordPress имеет четыре функции для выполнения этих действий:

    Сначала это может быть немного запутанным. Все первые 3 функции могут создавать новых пользователей, и « wp_insert_user » и « wp_update_user » могут обновлять существующих пользователей. Но для этого есть причина.

    Есть два способа создать нового пользователя:

    1. Передавая только минимальную информацию, необходимую для создания пользователя (имя пользователя, пароль и адрес электронной почты). В этом случае вам следует использовать функцию wp_create_user .
    2. Передав массив данных пользователя. В этом случае вам следует использовать функцию wp_insert_user . Это дает возможность установить любые пользовательские данные для вашего пользователя перед его добавлением.

    Чтобы обновить существующего пользователя, вы должны использовать wp_update_user . Можно использовать тот же wp_insert_user ; однако эта функция не хэширует пароль пользователя и, таким образом, может не работать. Поэтому лучше использовать правильную функцию для правильной работы.

    Ниже я приведу примерный фрагмент использования каждой функции. Однако вам следует обратиться к Кодексу, если вы ищете более подробную документацию.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    add_action( ‘init’, ‘wpttuts_createuser’ );
     
    function wpttuts_createuser() {
        // User Data
        $user_name = ‘new_user’;
        $user_password = ‘new_user_password’;
        $user_email = ‘[email protected]’;
     
        // Create the user
        $user_id = wp_create_user( $user_name, $user_password, $user_email );
     
        // Checks if the function returned a WP Error Object
        if ( is_wp_error ($user_id) ) {
            $user_id->get_error_message();
        }
        else {
            // user created successfully
        }
    }
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    add_action( ‘init’, ‘wpttuts_insertuser’ );
     
    function wpttuts_insertuser() {
        // Prepare the user data
        $user_data = array (
            ‘user_login’ => ‘new_user’,
            ‘user_password’ => ‘new_user_password’
            ‘user_email’ => ‘[email protected]’,
            ‘role’ => ‘administrator’
        );
     
        // Create the user
        $user_id = wp_insert_user( $user_data );
     
        // Checks if the function returned a WP Error Object
        if ( is_wp_error( $user_id ) ) {
            $user_id->get_error_message();
        }
        else {
            // user created successfully
        }
    }
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    add_action( ‘init’, ‘wpttuts_updateuser’ );
     
    function wpttuts_updateuser() {
     
        // Prepare the user data
        $user_data = array (
            ‘user_id’ => 3,
            ‘description’ => ‘ Our newly created user’
        );
     
        // Updates the user description
        $user_id = wp_update_user( $user_data );
     
        // Checks if the function returned a WP Error Object
        if ( is_wp_error( $user_id ) ) {
            $user_id->get_error_message();
        }
        else {
            // user updated successfully
        }
    }
    1
    2
    3
    4
    5
    6
    7
    add_action( ‘init’, ‘wpttuts_deleteuser’ );
     
    function wpttuts_deleteuser() {
        if ( wp_delete_user( 3, 1 ) ) {
            // User removed successfully
        }
    }
  2. WordPress раньше предлагал две функции для получения списка пользователей, поэтому вам не нужно запрашивать базу данных. Первая функция « get_users_of_blog() » возвращает массив всех пользователей в текущем блоге (или вы можете передать идентификатор блога, если вы запускаете установку MultiSite). Вторая функция « get_users() » возвращает список пользователей на основе аргументов, переданных функции. Это исключает необходимость выполнения пользовательских запросов SQL к базе данных.

    Обе функции возвращают массив объектов пользовательских данных. (За исключением get_users() где вы можете указать, что нужно возвращать только определенное поле.) Пользовательский объект будет более подробно рассмотрен в следующем разделе.

    Функция « get_users_of_blog() » теперь устарела, поэтому вам больше не следует ее использовать, а вместо нее используйте « get_users() ». Ниже приведен пример использования функции get_users() .

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    add_action( ‘init’, ‘wpttuts_getusers’ );
     
    function wpttuts_getusers() {
        // Query criteria
        $args = array (
            ‘orderby’ => ‘url’,
            ‘order’ => ‘ASC’
        );
     
        // Get the users array
        $users = get_users( $args );
     
        // Loop through users, and display their home page
        foreach( $users as $user) {
            echo ‘<a href=»‘ . $user->user_url . ‘»>’ .
        }
    }

    Аргумент функции принимает больше параметров. Вы можете найти полный список этих опций на странице кодекса функции.

    • blog_id только для многосайтовых установок. Значением по умолчанию является текущий идентификатор блога.
    • role Ограничьте возвращаемых пользователей указанной ролью.
    • include Массив идентификаторов пользователей для включения в возвращаемый запрос.
    • exclude Массив идентификаторов пользователей для исключения из возвращенного запроса.
  3. Класс WP_User позволяет получить доступ к свойствам, возможностям и методам, относящимся к конкретному пользователю. Для создания нового экземпляра класса вам понадобится идентификатор пользователя или имя пользователя; и если вы используете многосайтовую установку, вам также понадобится идентификатор блога.

    Вы можете инициировать класс для конкретного пользователя и вывести содержимое класса. Это отобразит только свойства, но все еще полезно, если вы хотите читать внутри пользовательского класса.

    1
    2
    3
    4
    5
    6
    add_action( ‘init’, ‘wptuts_wpuserclass’ );
     
    function wptuts_wpuserclass() {
        $user = new WP_User( 1 );
        var_dump( $user );
    }

    Ниже приводится краткое описание свойств и методов класса WP_User :

    • data ( объект с пользовательскими данными, такими как имя пользователя, пароль, URL …)
    • ID ( Integer ID пользователя)
    • caps ( Array )
    • roles ( Массив Ролей, назначенных пользователю)
    • cap_key ( String )
    • allcaps ( Array Все возможности, которые есть у пользователя)
    • filter ( нулевой )
    • get_role_caps() Устанавливает роли и свойства allcaps.
    • add_role() Добавить роль для пользователя.
    • remove_role() Удалить роль из пользователя.
    • set_role() Установите роль для пользователя. Это удалит ранее назначенные роли.
    • add_cap() Добавить возможность для пользователя.
    • remove_cap() Удалить возможность от пользователя.
    • remove_all_caps() Удалить все возможности пользователя.
    • has_cap() Проверяет, есть ли у пользователя возможность или имя роли.
  4. Как указывалось в предыдущей статье, метаданные пользователей — это данные о пользователе, сохраненные в таблице wp_usermeta . Он сохраняется как значения ключа / пары, а мета-значение может быть любым типом данных. Пара не обязательно уникальна. Вы можете хранить несколько пар с одним и тем же ключом.

    Функция add_user_meta() добавляет новые пользовательские метаданные. Функция возвращает истину, если данные успешно добавлены, и ложь в случае сбоя. Как упоминалось ранее, можно добавить много мета-значений с одним и тем же ключом. Если вы хотите сделать мета-ключи уникальными, установите для четвертого аргумента значение true.

    1
    2
    3
    4
    5
    6
    7
    8
    add_action(‘init’, ‘wptuts_addusermeta’);
     
    function wptuts_addusermeta() {
        // Add multiple meta values with the same meta key
        add_user_meta( 1, ‘bookmarks’, ‘http://site1.com’, false );
        add_user_meta( 1, ‘bookmarks’, ‘http://site2.com’, false );
        add_user_meta( 1, ‘bookmarks’, ‘http://site3.com’, false );
    }

    Функция get_user_meta() возвращает мета-значение на основе идентификатора пользователя и мета-ключа, переданного ему.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    add_action(‘init’, ‘wptuts_getusermeta’);
     
    function wptuts_getusermeta() {
        // Retrieves the user bookmarks
        $bookmarks = get_user_meta( 1, ‘bookmarks’, false );
        echo ‘<ul>’;
        foreach ( $bookmarks as $bookmark ) {
            echo ‘<li><a href=»‘ . $bookmark . ‘»>’ .
        }
        echo ‘</ul>’;
    }

    Функция update_user_meta() обновляет одно мета-значение. Если для одного и того же мета-ключа существует несколько значений, а предыдущее мета-значение не указано, то новое значение будет перезаписывать все предыдущие мета-значения.

    1
    2
    3
    4
    5
    6
    add_action(‘init’, ‘wptuts_updateusermeta’);
     
    function wptuts_updateusermeta() {
        // Updates a user bookmark
        update_user_meta( 1, ‘bookmarks’, ‘https://site2.com’, ‘http://site2.com’ );
    }

    Функция delete_user_data() удаляет один или все мета-ключ / пары для данного мета-ключа. Если вы хотите удалить одно значение, вам следует указать его в третьем аргументе.

    1
    2
    3
    4
    5
    6
    add_action(‘init’, ‘wptuts_removeusermeta’);
     
    function wptuts_removeusermeta() {
        // Updates a user bookmark
        delete_user_meta( 1, ‘bookmarks’, ‘https://site2.com’ );
    }

  1. Роли WordPress расширяемы. Вы можете добавлять и удалять роли. Добавить роль довольно просто, вам нужно имя слагаемого роли, отображаемое имя для роли; и возможности, которые имеет роль.

    1
    2
    3
    4
    5
    6
    add_action( ‘init’, ‘wptuts_addrole’ );
     
    function wptuts_addrole() {
        add_role( ‘uploader’, ‘Uploader’, array(‘upload_files’) );
        add_role( ‘link_manager’, ‘Link Manager’, array(‘manage_links’) );
    }

    Если вы зайдете на страницу настроек пользователя (Пользователь-> Выбрать любого пользователя-> Редактировать), вы обнаружите, что ваши вновь добавленные роли доступны. Они отображаются с отображаемым именем, которое вы ввели.

    Важно отметить, что создание роли должно быть сделано только один раз. Так что, если вы подключаетесь к действию « init », как в приведенном выше коде, вы заново создаете роль при каждом запуске кода. Это не хорошая вещь; на практике вы хотите создать его только один раз. Затем вы можете подключить его к крюку активации плагина и обязательно удалить его, когда плагин деактивирован.

    Удаление ролей тоже довольно просто. Вам просто нужно имя роли слизняка.

    1
    2
    3
    4
    5
    6
    add_action( ‘init’, ‘wptuts_removerole’ );
     
    function wptuts_removerole() {
        remove_role( ‘uploader’ );
        remove_role( ‘link_manager’ );
    }
  2. Как и у пользователей, у ролей есть специальный класс: WP_Role . Однако для инициализации этого класса требуются как имя роли, так и возможности роли; что не совсем так полезно.

    WordPress предлагает другую функцию get_role() которая требует только имя роли и инициализирует класс для вас.

    1
    2
    3
    4
    5
    6
    add_action(‘init’, ‘wptuts_getrole’);
     
    function wptuts_getrole() {
        $role = get_role(‘editor’);
        var_dump($role);
    }

    Возвращаемый объект имеет два свойства и три метода.

    • capabilities Массив возможностей, которые имеет роль.
    • name роли.
    • add_cap() Добавить возможность к объекту роли
    • has_cap() Проверьте, имеет ли роль возможность
    • remove_cap() Удалить возможность из роли
  3. Роли и возможности есть, они ничего не делают. Вы должны применять их в своем плагине или теме, проверяя их перед выполнением кода. Вы должны всегда проверять возможности, а не роли. Пользователь с ролью «редактор» не гарантирует, что у него есть возможности по умолчанию, которые WordPress назначает для этой роли, поскольку они могут быть изменены другим плагином или самим владельцем блога.

    WordPress имеет 3 функции для проверки прав доступа, которые в некоторой степени взаимозаменяемы.

    current_user_can() проверяет, имеет ли текущий пользователь указанную возможность. Он также принимает сообщение или объект для проверки мета-возможностей.

    user_can() работает таким же образом, но вы можете указать идентификатор пользователя. Однако он не проверяет мета-возможности. Так что немного не хватает, если вы хотите проверить мета-возможности для пользователя, отличного от текущего пользователя. Для этого вы можете использовать author_can() которая проверяет, может ли автор сообщения выполнить определенную задачу на основе возможности и идентификатора сообщения.

    1
    2
    3
    4
    5
    6
    7
    // checks if the post author of the first post can publish the post
    if ( author_can( 1, ‘publish_posts’) ) {
        publish_post_function();
    }
    else {
        echo «You don’t have the right to publish the post»;
    }

В этой части я попытался охватить как можно больше функций WordPress, а также объяснить, когда следует использовать каждую функцию. Теперь вы должны иметь возможность создать плагин или тему, которая использует систему возможностей. В следующей части я покажу вам, как создать плагин, который использует эту систему.