Построение системы Advanced Извещение WordPress

Много инструментов позволит нам распространять контент веб-сайта, но когда мы должны оперативно достичь целевой группы, система уведомление по электронной почте может быть лучшим вариантом.

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

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

Могу ли я использовать плагин

Если это ваш WordPress CMS, вы можете выбирать из целого ряда плагинов, таких как комплексного JetPack 1 | __12 или более специализированных Подписаться 2 __15 | | 2__8 .

Subscribe 2 settings page 3
Подписаться 2 страница настроек.( Просмотр большой version __31 | | 4__8 )

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

Вещей, Do

Мы собираемся добавить несколько функциональных возможностей к ядру WordPress ‘, и CMS позволяет нам заявить наши собственные функции в главном файле плагина.Мы не собираемся нырять глубоко в разработки плагинов, но вы можете получить необходимую информацию непосредственно от Codex __44 | | 5__8 .

Мы должны выполнить следующие задачи:

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

Добавить Meta поля для Profiles

WordPress хранит пользовательские данные в wp_users и wp_usermeta столы .

WordPress database description
Описание базы данных WordPress.(Изображение: Codex 6 )

Здесь wp_users содержит список всех пользователей сайта, в то время как wp_usermeta содержит все метаданные, связанные с профиле каждого пользователя.Мета данные зарегистрированы в качестве пар ключ-значение в meta_key и meta_value поля .

WordPress генерирует кучу мета-данных, таких как nickname, first_name, last_name, description и wp_capabilities.Многие из этих данных автоматически присваивается профиле каждого пользователя, и пользователь имеет возможность редактировать это позже из их страницы профиля .

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

В основной файл плагина, давайте определим глобальную ассоциативный массив, элементы которого состоят из названий штатов США:

$smashing_notification_states = array( 'AL' => 'Alabama', 'AK' => 'Alaska', 'AZ' => 'Arizona', 'AR' => 'Arkansas', 'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware', 'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho', 'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas', 'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine', 'MD' => 'Maryland', 'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MS' => 'Mississippi', 'MO' => 'Missouri', 'MT' => 'Montana', 'NE' => 'Nebraska', 'NV' => 'Nevada', 'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NY' => 'New York', 'NC' => 'North Carolina', 'ND' => 'North Dakota', 'OH' => 'Ohio', 'OK' => 'Oklahoma', 'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina', 'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah', 'VT' => 'Vermont', 'VA' => 'Virginia', 'WA' => 'Washington', 'WV' => 'West Virginia', 'WI' => 'Wisconsin', 'WY' => 'Wyoming' );

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

add_action( 'show_user_profile', 'smashing_show_user_meta_fields' );
add_action( 'edit_user_profile', 'smashing_show_user_meta_fields' );

Здесь show_user_profile 7 срабатывает, когда пользователь просматривает свой собственный профиль, в то время как edit_user_profile 8 срабатывает, когда пользователь просматривает профиль другого пользователя.

Функция обратного вызова печатает разметки .

/**
 * Show custom user profile fields.
 *
 * @param obj $user The user object.
 */
function smashing_show_user_meta_fields( $user ) { 
    global $smashing_notification_states;
    ?>
    <h3><?php _e( 'Smashing profile information', 'smashing' ); ?></h3>
    <table class="form-table">
        <tr>
            <th scope="row"><?php _e( 'State', 'smashing' ); ?></th>
            <td>
                <label for="state">
                    <select name="state">
                        <option value="" <?php selected( get_user_meta( $user->ID, 'state', true ), "" ); ?>>Select</option>
                        <?php foreach ($smashing_notification_states as $key => $value) { ?>
                            <option value="<?php echo $key; ?>" <?php selected( esc_attr( get_user_meta( $user->ID, 'state', true ) ), $key ); ?>><?php echo $value; ?></option>
                        <?php } ?>
                    </select>
                    <?php _e( 'Select state', 'smashing' ); ?>
                </label>
            </td>
        </tr>
        <tr>
            <th scope="row"><?php _e( 'Notifications', 'smashing' ); ?></th>
            <td>
                <label for="notification">
                    <input id="notification" type="checkbox" name="notification" value="true" <?php checked( esc_attr( get_user_meta( $user->ID, 'notification', true ) ), 'true' ); ?> />
                    <?php _e( 'Subscribe to email notifications', 'smashing' ); ?>
                </label>
            </td>
        </tr>
    </table>
<?php }        

Эта таблица содержит два пользовательских мета поля.Первый выбор меню которого варианты генерируются foreach цикл, который перебирает $smashing_notification_states Глобальный массива.Таким образом, пользователю не придется вводить имя своего государства, но вместо этого выбирает его из выпадающего списка .

Как вы можете видеть, мы называем selected() function 9 дважды изнутри двух <option> тегов;selected() это функция WordPress для сравнения двух строк.Когда струны имеют то же значение, функция печатает selected='selected';в противном случае, это отголоски пустую строку .

Первый раз мы называем selected(), мыСравнение стоимости текущего опциона ('state') с пустой строкой (что означает отсутствие состояния был выбран).При итерации по $smashing_notification_states массив, мы сравниваем значение каждого элемента в текущей стоимости 'state' мета области.Таким образом, мы можем автоматически выбрать опцию, соответствующую существующей 'state' стоимости .

Второй мета поле для добавления профилей пользователей является флажок.Его значение будет 'true' 39 ~ или | в зависимости от того, выбирает пользователь, чтобы получать уведомления.Подобно selected(), проверил () 10 | __7 печатает строки checked='checked', когда его два аргумента имеют то же значение.Конечно, checked() относится к флажки и переключатели .

Теперь, когда мы получили полей, мы можем сохранить введенные пользователем.Мы должны два крючка действий для хранения пользовательских данных:

add_action( 'personal_options_update', 'smashing_save_user_meta_fields' );
add_action( 'edit_user_profile_update', 'smashing_save_user_meta_fields' );

Здесь personal_options_update срабатывает, когда пользователь просматривает собственную страницу профиля, в то время как edit_user_profile_update срабатывает, когда пользователь с достаточными привилегиями просматривает страницу профиля другого пользователя.У нас есть два крючка, но только один обратный вызов:

/**
 * Store data in wp_usermeta table.
 *
 * @param int $user_id the user unique ID.
 */
function smashing_save_user_meta_fields( $user_id ) {

    if ( !current_user_can( 'edit_user', $user_id ) )
        return false;

    if( isset($_POST['state']) )
        update_user_meta( $user_id, 'state', sanitize_text_field( $_POST['state'] ) );

    if( !isset($_POST['notification']) ) 
        $_POST['notification'] = 'false';
    
    update_user_meta( $user_id, 'notification', sanitize_text_field( $_POST['notification'] ) );

}

Эта функция проверяет, имеет ли пользователь edit_user, и если current_user_can Правда, он проверяет данные и сохраняет его в wp_usermeta таблица .

Custom meta fields
Пользовательские поля мета добавил на страницу профиля пользователя .

Заказ Мета коробка и на заказ Fields

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

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

add_action( 'add_meta_boxes', 'smashing_add_meta_box' );
function smashing_add_meta_box(){

    $screens = array( 'post' ); // possible values: 'post', 'page', 'dashboard', 'link', 'attachment', 'custom_post_type'

    foreach ($screens as $screen) {
        add_meta_box(
            'smashing_metabox',                     // $id - meta_box ID
            __( 'Venue information', 'smashing' ),  // $title - a title for the meta_box container
            'smashing_meta_box_callback',           // $callback - the callback that outputs the html for the meta_box
            $screen,                                // $post_type - where to show the meta_box. Possible values: 'post', 'page', 'dashboard', 'link', 'attachment', 'custom_post_type'
            'normal',                               // $context - possible values: 'normal', 'advanced', 'side'
            'high'                                  // $priority - possible values: 'high', 'core', 'default', 'low'
            );
        }
}

Здесь add_meta_box 11 принимает семь аргументов: уникальный идентификатор для мета поле, название, функции обратного вызова, стоимость в течение screen, контекст (т.е. частиСтраница, где показывать окно мета), и приоритет и обратного вызова аргументы.Потому что мы не установив значение параметра аргумента обратного вызова, $post объект будет единственный аргумент передается smashing_meta_box_callback.Наконец, давайте определим функцию обратного вызова, чтобы распечатать мета окно:

/*
 * Print the meta_box
 *
 * @param obj $post The object for the current post
 */
function smashing_meta_box_callback( $post ){
    global $smashing_notification_states;

    // Add a nonce field
    wp_nonce_field( 'smashing_meta_box', 'smashing_meta_box_nonce' );

    $address = esc_attr( get_post_meta( get_the_ID(), 'address', true ) );
    $city = esc_attr( get_post_meta( get_the_ID(), 'city', true ) );
    $state = esc_attr( get_post_meta( get_the_ID(), 'state', true ) );
    $zip = esc_attr( get_post_meta( get_the_ID(), 'zip', true ) );
    $phone = esc_attr( get_post_meta( get_the_ID(), 'phone', true ) );
    $website = esc_attr( get_post_meta( get_the_ID(), 'website', true ) );
    $disable = esc_attr( get_post_meta( get_the_ID(), 'disable', true ) );
    ?>
<table id="venue">
    <tbody>
        <tr>
            <td class="label"><?php _e( 'Address', 'smashing' ); ?></td>
            <td><input type="text" id="address" name="venue[address]" value="<?php echo $address; ?>" size="30" /></td>
        </tr>
        <tr>
            <td><?php _e( 'City', 'smashing' ); ?></td>
            <td><input type="text" id="city" name="venue[city]" value="<?php echo $city; ?>" size="30" /></td>
        </tr>
        <tr>
            <td><?php _e( 'State', 'smashing' ); ?></td>
            <td>
                <select name="venue[state]">
                    <option value="" <?php selected( $state, "" ); ?>>Select</option>
                    <?php foreach ($smashing_notification_states as $key => $value) { ?>
                        <option value="<?php echo $key; ?>" <?php selected( $state, $key ); ?>><?php echo $value; ?></option>
                    <?php } ?>
                </select>
            </td>
        </tr>
        <tr>
            <td><?php _e( 'Disable notification', 'smashing' ); ?></td>
            <td><input id="disable" type="checkbox" name="venue[disable]" value="true" <?php checked( $disable, 'true' ); ?> /></td>
        </tr>
    </tbody>
</table>
<?php
}

Во-первых, мы инициализации global массив ирегистрации нонса field 12 .Затем мы добавляем две простые текстовые поля.name атрибут установлен в виде элемента массива, в то время как значение установлено на значение соответствующего настраиваемого поля.Наконец, основные пользовательские поля добавил .

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

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

add_action( 'save_post', 'smashing_save_custom_fields' );

/*
 * Save the custom field values
 *
 * @param int $post_id the current post ID
 */
function smashing_save_custom_fields( $post_id ){

    // Check WP nonce
    if ( !isset( $_POST['smashing_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['smashing_meta_box_nonce'], 'smashing_meta_box' ) )
        return;

    // Return if this is an autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    // check the post_type and set the correspondig capability value
    $capability = ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) ? 'edit_page' : 'edit_post';

    // Return if the user lacks the required capability
    if ( !current_user_can( $capability, $post_id ) )
        return;

    if( !isset($_POST['venue']['disable']) ) 
        $_POST['venue']['disable'] = 'false';

    // validate custom field values
    $fields = ( isset( $_POST['venue'] ) ) ? (array) $_POST['venue'] : array();
    $fields = array_map( 'sanitize_text_field', $fields );

    foreach ($fields as $key => $value) {
        // store data
        update_post_meta( $post_id, $key, $value );
    }
}

Наша обычай окно мета запущен и работает, и это выглядит так:

Custom meta box 13
Пользовательских мета окно с указанием сведений о местоположении.( Просмотр большой version __24 | 14 )

Строительство System

Если вы работали с пользовательских типов почтовых, вам потребуется publish_{$post_type} крюк (т.е. publish_recipes, publish_events, и т.д.).Но так как мы работаем с должности, publish_post это крючок для нас:

add_action( 'publish_post', 'smashing_notify_new_post' );

/*
* Notify users sending them an email
*
* @param int $post_ID the current post ID
*/
function smashing_notify_new_post( $post_ID ){
global $smashing_notification_states;

$url = get_permalink( $post_ID );
$state = get_post_meta( $post_ID, 'state', true );

if( 'true' == get_post_meta( $post_ID, 'disable', true ) )
return;

// build the meta query to retrieve subscribers
$args = array(
'meta_query' => array(
array( 'key' => 'state', 'value' => $state, 'compare' => '=' ),
array( 'key' => 'notification', 'value' => 'true', 'compare' => '=' )
),
'fields' => array( 'display_name', 'user_email' )
);
// retrieve users to notify about the new post
$users = get_users( $args );
$num = 0;
foreach ($users as $user) {

$to = $user->display_name . ' <' . $user->user_email . '>';

$subject = sprintf( __( 'Hei! We have news for you from %s', 'smashing' ), $smashing_notification_states[$state] );

$message = sprintf( __( 'Hi %s!', 'smashing' ), $user->display_name ) . "\r\n" .
sprintf( __( 'We h ...

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.