WordPress. Добавляем мета-теги. Часть 2 из 3

16.08.2019

Теги: CMSSEOWeb-разработкаWordPressМетаДанныеМетаТегиПлагин

На момент написания первой части, моих знаний было недостаточно, чтобы добавить мета-теги keywords и description для страниц списка записей. Т.е. на страницу списка записей выбранной рубрики (категории) и на на страницу списка записей с выбранной меткой (тегом). Теперь можно и продолжить — давайте создадим плагин, который добавит мета-теги для страниц рубрик и меток.

Что мы будем делать:

  • Зарегистрируем два мета-поля для таксономии «Рубрики»
  • Зарегистрируем два мета-поля для таксономии «Метки»
  • Добавим два textarea для формы добавления новой рубрики
  • Добавим два textarea для формы редактирования рубрики
  • Добавим два textarea для формы добавления новой метки
  • Добавим два textarea для формы редактирования метки
  • Добавим в таблицу БД wp_termmeta две записи при добавлении новой рубрики
  • Обновим в таблице БД wp_termmeta две записи при редактировании рубрики
  • Добавим в таблицу БД wp_termmeta две записи при добавлении новой метки
  • Обновим в таблице БД wp_termmeta две записи при редактировании метки
  • В публичной части при показе списка записей рубрики будем добавлять на страницу мета-теги
  • В публичной части при показе списка записей с меткой будем добавлять на страницу мета-теги
<?php
/*
Plugin Name: Добавляет мета-теги для рубрик и меток
Plugin URI: https://tokmakov.msk.ru
Description: Добавляет мета-теги keywords и description для рубрик и меток блога.
Version: 1.0
Author: Евгений Токмаков
Author URI: https://tokmakov.msk.ru
*/

register_activation_hook(__FILE__, function() {
    // проверяем права пользователя на активацию плагинов
    if (!current_user_can('activate_plugins')) {
        return;
    }
});

register_deactivation_hook(__FILE__, function() {
    // проверяем права пользователя на деактивацию плагинов
    if (!current_user_can('deactivate_plugins')) {
        return;
    }
});
/*
 * Регистрируем два метаполя для таксономии category и два метаполя для
 * таксономии post_tag, в которых будем хранить содержимое мета-тегов
 * keywords и description для каждой рубрики и для каждой метки
 */
add_action('init', function () {
    register_term_meta('category', 'tokmakov_meta_keywords', []);
    register_term_meta('category', 'tokmakov_meta_description', []);
    register_term_meta('post_tag', 'tokmakov_meta_keywords', []);
    register_term_meta('post_tag', 'tokmakov_meta_description', []);
});
/*
 * Добавляем два textarea для формы добавления новой рубрики
 */
add_action('category_add_form_fields', function () {
    ?>
    <div class="form-field">
        <label for="tokmakov-meta-description">Мета-тег description</label>
        <textarea name="tokmakov_meta_description"
                  id="tokmakov-meta-description" rows="3" cols="40"></textarea>
    </div>
    <div class="form-field">
        <label for="tokmakov-meta-keywords">Мета-тег keywords</label>
        <textarea name="tokmakov_meta_keywords"
                  id="tokmakov-meta-keywords" rows="3" cols="40"></textarea>
    </div>
    <?php
});

/*
 * Добавляем два textarea для формы редактирования существующей рубрики
 */
add_action('category_edit_form_fields', function ($term) {
    $description = get_term_meta(
        $term->term_id,
        'tokmakov_meta_description',
        true
    );
    $keywords = get_term_meta(
        $term->term_id,
        'tokmakov_meta_keywords',
        true
    );
    ?>
    <tr class="form-field">
        <th scope="row">
            <label for="tokmakov-meta-description">Мета-тег description</label>
        </th>
        <td>
            <textarea name="tokmakov_meta_description"
                      id="tokmakov-meta-description"
                      rows="3" cols="50"
                      class="large-text"><?= esc_attr($description); ?></textarea>
        </td>
    </tr>
    <tr class="form-field">
        <th scope="row">
            <label for="tokmakov-meta-keywords">Мета-тег keywords</label>
        </th>
        <td>
            <textarea name="tokmakov_meta_keywords"
                      id="tokmakov-meta-keywords"
                      rows="3" cols="50"
                      class="large-text"><?= esc_attr($keywords); ?></textarea>
        </td>
    </tr>
    <?php
});
/*
 * Добавляем два textarea для формы добавления новой метки
 */
add_action('post_tag_add_form_fields', function () {
    ?>
    <div class="form-field">
        <label for="tokmakov-meta-description">Мета-тег description</label>
        <textarea name="tokmakov_meta_description"
                  id="tokmakov-meta-description"rows="3" cols="40"></textarea>
    </div>
    <div class="form-field">
        <label for="tokmakov-meta-keywords">Мета-тег keywords</label>
        <textarea name="tokmakov_meta_keywords"
                  id="tokmakov-meta-keywords" rows="3" cols="40"></textarea>
    </div>
    <?php
});

/*
 * Добавляем два textarea для формы редактирования существующей метки
 */
add_action('post_tag_edit_form_fields', function ($term) {
    $description = get_term_meta(
        $term->term_id,
        'tokmakov_meta_description',
        true
    );
    $keywords = get_term_meta(
        $term->term_id,
        'tokmakov_meta_keywords',
        true
    );
    ?>
    <tr class="form-field">
        <th scope="row">
            <label for="tokmakov-meta-description">Мета-тег description</label>
        </th>
        <td>
            <textarea name="tokmakov_meta_description"
                      id="tokmakov-meta-description"
                      rows="3" cols="50"
                      class="large-text"><?= esc_attr($description); ?></textarea>
        </td>
    </tr>
    <tr class="form-field">
        <th scope="row">
            <label for="tokmakov-meta-keywords">Мета-тег keywords</label>
        </th>
        <td>
            <textarea name="tokmakov_meta_keywords"
                      id="tokmakov-meta-keywords"
                      rows="3" cols="50"
                      class="large-text"><?= esc_attr($keywords); ?></textarea>
        </td>
    </tr>
    <?php
});
/*
 * Назначаем обработчики событий добавления и обновления рубрики
 * или метки
 */
add_action('create_category', 'tokmakov_save_meta_data');
add_action('edited_category', 'tokmakov_save_meta_data');
add_action('create_post_tag', 'tokmakov_save_meta_data');
add_action('edited_post_tag', 'tokmakov_save_meta_data');
/*
 * Сохраняем в базу данных значения мета-тегов при добавлении или
 * обновлении рубрики или метки
 */
function tokmakov_save_meta_data($term_id) {

    if (!current_user_can('edit_term', $term_id)) {
        return;
    }

    if (isset($_POST['tokmakov_meta_description'])) {
        $description = iconv_substr(
            $_POST['tokmakov_meta_description'],
            0,
            200
        );
        $description = trim($description);
        if (!empty($description)) {
            update_term_meta(
                $term_id,
                'tokmakov_meta_description',
                $description
            );
        } else {
            delete_term_meta(
                $term_id,
                'tokmakov_meta_description'
            );
        }
    }

    if (isset($_POST['tokmakov_meta_keywords'])) {
        $keywords = iconv_substr(
            $_POST['tokmakov_meta_keywords'],
            0,
            200
        );
        $keywords = trim($keywords);
        if (!empty($keywords)) {
            update_term_meta(
                $term_id,
                'tokmakov_meta_keywords',
                $keywords
            );
        } else {
            delete_term_meta(
                $term_id,
                'tokmakov_meta_keywords'
            );
        }
    }
}
/*
 * Добавляем мета-теги keywords и description в публичной части сайта
 */
add_action(
    'wp_head',
    function () {
        if (is_category() || is_tag()) {
            $temp = 'cat';
            if (is_tag()) {
                $temp = 'tag_id';
            }
            $id = get_query_var($temp);
            $description = get_term_meta($id, 'tokmakov_meta_description', true);
            if (!empty($description)) {
                ?>
                <meta name="description" content="<?= esc_attr($description); ?>" />
                <?php
            }
            $keywords = get_term_meta($id, 'tokmakov_meta_keywords', true);
            if (!empty($keywords)) {
                ?>
                <meta name="keywords" content="<?= esc_attr($keywords); ?>" />
                <?php
            }
        }
    },
    1
);

При удалении плагина удаляем записи из таблицы БД wp_termmeta в файле uninstall.php:

<?php
if (!defined('WP_UNINSTALL_PLUGIN')) {
    exit;
}

global $wpdb;
$query = "DELETE FROM
              `" . $wpdb->termmeta . "`
          WHERE
              `meta_key` IN ('tokmakov_meta_description', 'tokmakov_meta_keywords')";
$wpdb->query($query);

Дополнительно

Поиск: CMS • SEO • Web-разработка • WordPress • Мета данные • Мета теги • Плагин

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.