Статьи

Создание простой CRM в WordPress: создание пользовательских полей

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

WordPress имеет add_meta_box() , которая позволяет разработчикам плагинов и тем регистрировать собственные мета-блоки на различных экранах администрирования WordPress.

WordPress регистрирует некоторые из своих собственных мета-блоков для отображения при создании публикации или страницы. Например, на страницах у вас есть мета-поле Атрибуты страницы :

Давайте добавим мета-поле к нашему типу постов « Контакты ». Откройте файл плагина, который вы создали в первом уроке этой серии. Затем в конструкторе плагина обновите код, чтобы он соответствовал приведенному ниже. Это регистрирует нашу функцию register_meta_boxes() для действия add_meta_boxes :

1
2
3
4
5
6
7
8
9
/**
* Constructor.
*/
function __construct() {
 
    add_action( ‘init’, array( $this, ‘register_custom_post_type’ ) );
    add_action( ‘add_meta_boxes’, array( $this, ‘register_meta_boxes’ ) );
     
}

Затем в нашей функции register_meta_boxes() мы добавляем вызов add_meta_box() . Это говорит WordPress, что нам нужен мета-бокс с именем Contact Details , который отображается нашей output_meta_box() . Добавьте приведенный ниже код после функции конструктора:

1
2
3
4
5
6
/**
* Registers a Meta Box on our Contact Custom Post Type, called ‘Contact Details’
*/
function register_meta_boxes() {
    add_meta_box( ‘contact-details’, ‘Contact Details’, array( $this, ‘output_meta_box’ ), ‘contact’, ‘normal’, ‘high’ );
}

Наконец, нам нужна output_meta_box() , которая вызывается add_meta_box выше. Добавьте приведенный ниже код после функции register_meta_boxes() :

1
2
3
4
5
6
7
8
/**
* Output a Contact Details meta box
*
* @param WP_Post $post WordPress Post object
*/
function output_meta_box($post) {
 
}

Давайте проверим, есть ли у нас мета-поле в нашем пользовательском типе записи. Создайте новый контакт в панели управления WordPress, выбрав Контакты> Добавить новый.

Если все написано правильно, вы должны увидеть что-то похожее на следующий скриншот:

Давайте продолжим и добавим поле адреса электронной почты в этот мета-блок. Измените вашу функцию output_meta_box на следующий код:

01
02
03
04
05
06
07
08
09
10
11
/**
* Output a Contact Details meta box
*
* @param WP_Post $post WordPress Post object
*/
function output_meta_box( $post ) {
    // Output label and field
    echo ( ‘<label for=»contact_email»>’ . __( ‘Email Address’, ‘tuts-crm’ ) . ‘</label>’ );
    echo ( ‘<input type=»text» name=»contact_email» id=»contact_email» value=»‘ . esc_attr( $email ) . ‘» />’ );
     
}

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

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

Как и в случае большинства действий, мы зарегистрируем наше действие в конструкторе плагина:

01
02
03
04
05
06
07
08
09
10
/**
* Constructor.
*/
function __construct() {
 
    add_action( ‘init’, array( $this, ‘register_custom_post_type’ ) );
    add_action( ‘add_meta_boxes’, array( $this, ‘register_meta_boxes’ ) );
    add_action( ‘save_post’, array( $this, ‘save_meta_boxes’ ) );
     
}

Далее, давайте создадим нашу save_meta_boxes() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Saves the meta box field data
*
* @param int $post_id Post ID
*/
function save_meta_boxes( $post_id ) {
 
    // Check this is the Contact Custom Post Type
    if ( ‘contact’ != $_POST[‘post_type’] ) {
        return $post_id;
    }
 
    // Check the logged in user has permission to edit this post
    if ( ! current_user_can( ‘edit_post’, $post_id ) ) {
        return $post_id;
    }
 
    // OK to save meta data
    $email = sanitize_text_field( $_POST[‘contact_email’] );
    update_post_meta( $post_id, ‘_contact_email’, $email );
     
}

Эта функция выполняет несколько действий, потому что WordPress и другие плагины могут довольно часто save_post действие save_post (например, при периодическом автосохранении черновика или при сохранении другого типа записи). Мы должны быть уверены, что мы сохраняем данные нашего пользовательского поля, только если пользователь сохранил или обновил контакт.

Если мы сохраняем контакт, мы очищаем адрес электронной почты. Из Кодекса WordPress:

Проверяет наличие недействительных UTF-8, конвертирует одиночные символы <в сущность, удаляет все теги, удаляет разрывы строк, табуляции и лишние пробелы, удаляет октеты.

Короче говоря, мы убеждаемся, что в нашей текстовой строке нет лишнего форматирования.

Наконец, мы сохраняем адрес электронной почты в метаданных записи, используя update_post_meta . Думайте о мета поста как о последовательности пар ключ / значение, которые прикреплены к посту. Вы можете иметь столько, сколько хотите. В нашем примере мы сохраняем значение нашего настраиваемого поля в ключе _contact_email .

Создайте новый контакт и введите адрес электронной почты. Сохраните новый контакт, и вы заметите, что адрес электронной почты не появляется в поле:

Нам нужно отредактировать нашу output_meta_box() чтобы прочитать метаданные Post и отобразить ее в поле ввода. Измените output_meta_box() на следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
/**
* Output a Contact Details meta box
*
* @param WP_Post $post WordPress Post object
*/
function output_meta_box($post) {
 
    $email = get_post_meta( $post->ID, ‘_contact_email’, true );
     
    // Output label and field
    echo ( ‘<label for=»contact_email»>’ . __( ‘Email Address’, ‘tuts-crm’ ) . ‘</label>’ );
    echo ( ‘<input type=»text» name=»contact_email» id=»contact_email» value=»‘ . esc_attr( $email ) . ‘» />’ );
     
}

Мы используем get_post_meta() чтобы получить значение для заданной комбинации идентификатора и идентификатора сообщения. Мы знаем, что мета-ключ _contact_email , так как именно это мы использовали, когда сохранили значение настраиваемого поля в update_post_meta()

Безопасность чрезвычайно важна при отправке и обработке данных формы. Мы должны знать, что источник наших данных заслуживает доверия при его сохранении. Если мы не можем доверять источнику наших данных, мы не должны их хранить — данные могут быть скомпрометированы или повреждены таким образом, чтобы попытаться использовать ошибку или уязвимость системы безопасности.

WordPress предоставляет нам одноразовые номера («число, использованное один раз»), которые можно отправить вместе с данными формы. Этот одноразовый номер может быть проверен при запуске нашей процедуры сохранения, чтобы убедиться, что он соответствует ожидаемому значению.

Это помогает предотвратить атаки подделки межсайтовых запросов (CSRF), т. Е. Кто-то пытается отправить данные формы в нашу подпрограмму сохранения с другого веб-сайта.

Нам нужно добавить в безопасности вышеупомянутый код в двух местах:

  1. output_meta_box() : добавить значение nonce в форму
  2. save_meta_boxes() : проверить отправленное значение nonce

Давайте output_meta_box() функцию output_meta_box() , заменив ее следующим кодом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
/**
* Output a Contact Details meta box
*
* @param WP_Post $post WordPress Post object
*/
function output_meta_box($post) {
 
    $email = get_post_meta( $post->ID, ‘_contact_email’, true );
     
    // Add a nonce field so we can check for it later.
    wp_nonce_field( ‘save_contact’, ‘contacts_nonce’ );
     
    // Output label and field
    echo ( ‘<label for=»contact_email»>’ . __( ‘Email Address’, ‘tuts-crm’ ) . ‘</label>’ );
    echo ( ‘<input type=»text» name=»contact_email» id=»contact_email» value=»‘ . esc_attr( $email ) . ‘» />’ );
     
}

Это использует wp_nonce_field() , чтобы создать скрытое поле с именем contacts_nonce , с действием, называемым save_contact . Его значение генерируется WordPress.

Далее давайте отредактируем подпрограмму сохранения в save_meta_boxes() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* Saves the meta box field data
*
* @param int $post_id Post ID
*/
function save_meta_boxes( $post_id ) {
 
    // Check if our nonce is set.
    if ( ! isset( $_POST[‘contacts_nonce’] ) ) {
        return $post_id;
    }
 
    // Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $_POST[‘contacts_nonce’], ‘save_contact’ ) ) {
        return $post_id;
    }
 
    // Check this is the Contact Custom Post Type
    if ( ‘contact’ != $_POST[‘post_type’] ) {
        return $post_id;
    }
 
    // Check the logged in user has permission to edit this post
    if ( ! current_user_can( ‘edit_post’, $post_id ) ) {
        return $post_id;
    }
 
    // OK to save meta data
    $email = sanitize_text_field( $_POST[‘contact_email’] );
    update_post_meta( $post_id, ‘_contact_email’, $email );
     
}

Это добавляет две проверки в нашу процедуру сохранения:

  1. Убедитесь, что в нашей форме задано одноразовое поле. Если нет, не сохраняйте ничего.
  2. Убедитесь, что значение поля nonce соответствует ожидаемому. Если нет, не сохраняйте ничего.

Создайте или измените свой контакт и убедитесь, что адрес электронной почты теперь сохраняется.

В следующей статье мы собираемся использовать расширенные настраиваемые поля, чтобы добавить настраиваемые поля к нашему настраиваемому типу публикации « Контакт », что позволит нам создать богатый пользовательский интерфейс с более широким диапазоном типов ввода.