Использование мета-боксов WordPress для создания SEO-плагина

Одной из функций ядра, поставляемой WordPress в расширенной конфигурации, является Мета Box API. Она позволяют легко добавлять к контенту дополнительные данные. Например, через панель Метки можно задать теги для вашего поста.

В этой статье я расскажу, как создать базовый SEO плагин, который добавляет мета-описание, а также Open Graph теги тайтлов и описаний в элемент head страниц WordPress. При этом вы также узнаете, как создавать пользовательские мета-боксы, как проверять предоставленные пользователями данные, как сохранять данные для записи или страницы и как извлекать сохраненные данные.

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

Создание Meta Box

Во-первых, мы должны решить, где будет выводиться окно мета-бокса.

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

И, наконец, функция подключается к действию add_meta_boxes:

function tes_mb_create() {

    /**
     * @array $screens записывает названия панелей, в которых будет выводиться мета-бокс
     * @values записи, страницы, панели инструментов, ссылки, вложения, custom_post_type
     */
    $screens = array( 'post', 'page' );

    foreach ( $screens as $screen ) {

        add_meta_box(
            'tes-meta',
            'Search Engine Listing',
            'tes_mb_function',
            $screen,
            'normal',
            'high'
        );
    }
}
add_action( 'add_meta_boxes', 'tes_mb_create' );

Альтернативно можно добавить двойную функцию add_meta_box, чтобы включить мета-бокс и в запись, и в страницу следующим образом:

function tes_mb_create() {

    add_meta_box(
        'tes-meta', 
        'Search Engine Listing', 
        'tes_mb_function', 
        'post', 
        'normal', 
        'high'
    );

    add_meta_box(
        'tes-meta', 
        'Search Engine Listing', 
        'tes_mb_function', 
        'page', 
        'normal', 
        'high'
    );
}
add_action('add_meta_boxes', 'tes_mb_create');

Из приведенного выше кода следует, что функция обратного вызова, которая поставляет HTML-код вводимый в панели, приводится как tes_mb_function – третий аргумент, придаваемый функции add_meta_box.

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

function tes_mb_function($post) {

    / /получение значений мета-данных, если они существуют
    $tes_meta_title = get_post_meta( $post->ID, '_tes_meta_title', true );
    $tes_meta_description = get_post_meta( $post->ID, '_tes_meta_description', true );

    // Добавление поля частного случая, чтобы мы могли проверить его позже при валидации
    wp_nonce_field( 'tes_inner_custom_box', 'tes_inner_custom_box_nonce' );

    echo '<div style="margin: 10px 100px; text-align: center">
    <table>
        <tr>
            <td><strong>Title Tag:</strong></td><td>
            <input style="padding: 6px 4px; width: 300px" type="text" name="tes_meta_title" value="' . esc_attr($tes_meta_title) . '" />
            </td>
        </tr>
        <tr>
            <td><strong>Meta Description:</strong></td><td>           <textarea  rows="3" cols="50" name="tes_meta_description">' . esc_attr($tes_meta_description) . '</textarea></td>
        </tr>
    </table>
</div>';

}

Вот что делает код tes_mb_function:

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

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

    Сохранение данных Meta Box

    Meta Box не является полноценным, пока он не может записать данные в базу данных. Имя функции для обработки сохранения данных будет tes_mb_save_data. Ее код выглядит следующим образом:

    function tes_mb_save_data($post_id) {
     
         /*
          * Мы должны убедиться, что данные исходят из нашей панели и от авторизированного
     надлежащим образом источника,
          * потому что save_post может быть вызван в любое время.
          */
     
         // Проверяем, задан ли частный случай.
         if ( ! isset( $_POST['tes_inner_custom_box_nonce'] ) )
             return $post_id;
     
         $nonce = $_POST['tes_inner_custom_box_nonce'];
     
         // Проверяем валидность частного случая.
         if ( ! wp_verify_nonce( $nonce, 'tes_inner_custom_box' ) )
             return $post_id;
     
         // Если используется автосохранение, наша форма не должна содержать
     запрос на подтверждение, и мы не хотим делать больше ничего.
         if ( defined( 'DOING_AUTOSAVE') && DOING_AUTOSAVE )
             return $post_id;
     
         // Проверка прав доступа пользователя.
         if ( 'page' == $_POST['post_type'] ) {
     
             if ( ! current_user_can( 'edit_page', $post_id ) )
                 return $post_id;
         } else {
     
             if ( ! current_user_can( 'edit_post', $post_id ) )
                 return $post_id;
         }
     
         /* OK, данные не содержат угроз и могут быть сохранены. */
     
         // Если существуют старые записи, извлекаем их
         $old_title = get_post_meta( $post_id, '_tes_meta_title', true );
         $old_description = get_post_meta( $post_id, '_tes_meta_description', true );
     
         // Проводим проверку безопасности введенных пользователем данных.
         $title = sanitize_text_field( $_POST['tes_meta_title'] );
         $description = sanitize_text_field( $_POST['tes_meta_description'] );
     
         // Обновляем мета-поля в базе данных.
         update_post_meta( $post_id, '_tes_meta_title', $title, $old_title );
         update_post_meta( $post_id, '_tes_meta_description', $description, $old_description );
     }
     add_action( 'save_post', 'tes_mb_save_data' );

    Давайте детальнее рассмотрим этот код:

    • во-первых, мы проверяем, что данные исходят из нашей панели и от авторизированного соответствующим образом источника, потому что save_post могут вызываться в любое другое время, а также убеждаемся, что частный случай, установленный ранее в tes_mb_function, действителен;
    • Сохранение данных Meta Box
    • Когда вы добавили и сохранили тайтл и описание записи или страницы, можно проверить, что источник страницы содержит Open Graph теги тайтла и описания, а также мета-описание.

      Для этого используется поисковая система:

      Сохранение данных Meta Box - 2

      Заключение

      В этой статье мы рассмотрели создание базового SEO-плагина, который добавляет мета-описание и Open Graph теги, используемые поисковыми системами социальных сетей, для раздела заголовка WordPress.

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

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

      РедакцияПеревод статьи «Using WordPress Meta Boxes to Build a Basic SEO Plugin»