Основы использования

Очистка значений метаполей при сохранении

Значение любого метаполя можно очистить через фильтр: sanitize_(type)_meta_(meta_key).


Этот фильтр срабатывает всегда при добавлении или обновлении метаполя.

Все варианты фильтра, если указать первый изменяемый параметр:

Пример использования фильтра

Допустим, у нас есть метаполе пользователя (моя история). В это поле пользователь может писать какой-то текст, но в нем нельзя использовать HTML теги. Чтобы быть уверенным наверняка, что туда не попадут эти самые теги, лучше всего очистить значение поля перед сохранением его в базу данных:

add_filter( 'sanitize_user_meta_'.'my_history', function( $meta_value ){
	return wp_strip_all_tags( $meta_value );
});

Problem with wp_commentmeta and wp_postmeta

Take a look at this example. In one of the blogs, which was regularly optimized with WP-Optimize but never manually cleaned, the following are the sizes of comments and posts tables:

  • wp_comments — 800 rows and 390.8 KiB
  • wp_commentmeta — 5,387 rows and 6.0 MiB
  • wp_posts — 1,300 rows and 3.7 MiB
  • wp_postmeta — 11,947 rows and 3.5 Mib

Why are the comments and posts meta data tables bigger than the comments and posts themselves? That’s because both wp_commentmeta and wp_postmeta tables can be quickly filled with junk or obsolete data such as Akismet validations and meta data of deleted posts and revisions. So let us see how to quickly clean wp_commentmeta and wp_postmeta and optimize them to clean up database.

get_metadata()

If you want to get the metadata of a certain object this time, and not a post, then the function you must use is . It’s syntax goes like below:

get_metadata($meta_type, $object_id, $meta_key, $single)

Two of this functions’ parameters are obligatory, that being and . The first one is the type of object the metadata is for, therefore it’s format is a string. The other one shows the ID of this object, making it to be an integer.

The other two optional parameters are , which shows the of the required metadata and retrieves metadata for all keys if left unspecified, and which is a boolean value that when set to true return only the first value for the specified metadata.

Почему важны WordPress мета теги: meta description, meta keywords и meta title?

Качество контента сайта важно, но только его недостаточно. В доступе у пользователей сейчас тысячи тысяч сайтов, и просматривать все сайты нет возможности, поэтому в основном ограничиваются 3-мя самыми популярными результатами из поисковой выдачи

Вот почему SEO считается святым граалем веб-маркетинга. Правильные и качественные SEO-мероприятия могут направить большое количеством трафика на ваш сайт.

Мета название (meta title) блога как часть его описания, рассказывает читателю о теме блога. Излишне говорить, что это самый важный пункт в этом списке, поскольку плохо сформулированный заголовок может чрезвычайно подпортить SEO вашего сайта.

Мета описание (meta description) помогает вашему блогу вдвойне: облегчает работу поисковой системы, кратко описывает содержание записи и привлекает пользователей сжатым и ёмким резюме записи.

Использование ключевых слов (keywords), с другой стороны, гораздо более спорный вопрос. В то время, как многие эксперты SEO верят, что это очень значительный фактор в SEO, другие считают, что ключевые слова не так уж много значат, включая Google (англ.).

В итоге, из-за того, что поисковые системы отказываются указывать вес различных факторов в ранжировании сайтов, мы точно не знаем, насколько значительную роль играют meta description и keywords в улучшении SEO вашего сайта

Однако мы знаем, что они играют определенную роль, чего должно быть достаточно, чтобы привлечь ваше внимание к ним

Существует множество плагинов, которые вы можете использовать для добавления мета описания и ключевых слов в ваш блог WordPress. В этом руководстве мы будем использовать популярный плагин Yoast SEO. Чтобы узнать, как установить плагин Yoast SEO на своём сайте WordPress, следуйте нашему специальному руководству (англ.), посвящённому этой теме.

Таблица wp_postmeta и класс WP_Query

Таблица содержит 4 поля:

  1. – первичный ключ;
  2. – bigint, индексированное;
  3. – varchar, индексированное;
  4. – longtext, не индексированное.

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

При этом поиск по ключу () выполняется быстро, т.к. поле индексировано. Т.е. функция

get_post_meta( $post_id, $key, $single );

работает быстро, т.к. поиск выполняется по двум индексированным полям.

А вот поиск постов на основе значений этих полей – совсем другое дело.

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


Делается это следующим образом.

$args = array(
     ...
     'relation' => 'AND',
     'meta_query' => array(
          array(
               'key' => 'rating',
               'value' => array(3, 4),
               'type' => 'numeric',
               'compare' => 'BETWEEN',
          ),
          array(
               'key' => 'votes',
               'value' => 100,
               'type' => 'numeric',
               'compare' => '>=',
          )
     )
);
$query = new WP_Query($args);

Такой запрос вернёт все статьи у которых значение рейтинга находится в диапазоне от 3-х до 4-х, а число проголосовавших – больше или равно 100.

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

В результате мы получим запрос вроде

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts
     INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
     INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
          WHERE 1=1
               AND wp_posts.post_type IN ('post', 'page')
               AND (wp_posts.post_status = 'publish')
               AND (
                    (wp_postmeta.meta_key = 'rating' AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '3' AND '4')
                    AND
                    (mt1.meta_key = 'votes' AND CAST(mt1.meta_value AS SIGNED) >= '100')
               )
     GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

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

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

В результате мы скорость выполнения запроса резко падает. И основная причина — .

Конкретные значения времени выполнения запроса будут зависеть от размера БД (количества записей в таблицах wp_posts, wp_postmeta) и производительности сервера. Я сталкивался с ситуациями, когда время выполнения запроса с 4-мя такими условиями при 100к+ записях в таблице wp_postmeta (около 5000 постов с примерно 20-ю метаданными на пост) доходило до нескольких минут. Более мощное железо в какой-то степени улучшит ситуацию, но проблему не решит.

Дело в том, что MySQL должен перебрать все возможные сочетания метаданных, а их количество экспоненциально увеличивается с каждым объединением.

Description

Are you using WordPress for a headless set-up, using the WP REST API? And would you like to use the Yoast SEO plugin just like you would for any other project? This plugin adds the meta tags generated by the Yoast SEO plugin to the WP REST API output, allowing your headless set-up to implement them. Also when you are using Yoast SEO Premium you have the option to retrieve redirects throught the API: this plugin adds a custom endpoint () to provide those redirects in a JSON format. Since Yoast 11.0 JSON LD Schema.org data is also supported and is now also available through the WP REST API when using this plugin.

Installation from within WordPress

  1. Visit ‘Plugins > Add New’ (or ‘My Sites > Network Admin > Plugins > Add New’ if you are on a multisite installation).
  2. Search for ‘WP REST Yoast Meta’.
  3. Activate the WP REST Yoast Meta plugin through the ‘Plugins’ menu in WordPress.

Precautionary Steps — Backup Tables

Realize that we are directly messing with the WordPress database and mistakes could make your site inaccessible. So it is always best to backup your database. I am going to show how easy it is do that from within phpMyAdmin. .

Login to your phpMyAdmin interface and click on you wp_comments meta table. Then, as shown in the picture below, under Operations->Copy table to, enter a name for the table backup. In this case I chose wp_commentmeta_bk. Then click «Go».

WordPress wp_commentmeta Table Backup

You should now have a new table with the name wp_commentmeta_bk. Repeat the same setups for wp_postmeta table. You may enter «wp_postmeta_bk» as the name for backup or choose your own name. Alternatively, you could export the whole database as a file and save it on your computer.

Интеграция в тему или плагин

Meta Box можно встроить в тему или плагин, т.е. использовать его не как плагин WP. Сделать это можно двумя способами.

Короткая инструкция по активации и использованию класса:

  1. Распакуйте скаченный архив и скопируйте из него файлы и в папку вашей темы или плагина. Переименуйте файл , придумайте понятное название.

  2. Откройте переименованный файл и добавьте Meta Box в список плагинов. В итоге получится примерно так:

    require_once dirname( __FILE__ ) . '/class-tgm-plugin-activation.php';
    
    add_action( 'tgmpa_register', 'prefix_register_required_plugins' );
    function prefix_register_required_plugins() {
    
    	$plugins = array(
    		array(
    			'name'     => 'Meta Box',
    			'slug'     => 'meta-box',
    			'required' => true,
    		),
    		// More plugins
    	);
    
    	$config  = array(
    		'id' => 'ваш-id',
    	)
    
    	tgmpa( $plugins, $config );
    }
  3. Подключите переименованный файл в файл темы или в главный файл плагина.

    require_once __DIR__ . '/example.php';

Теперь, после установки вашего плагина или темы, пользователь увидит уведомление, что нужно также установить плагин Meta Box из каталога WordPress.

Чтобы жестко внедрить Meta Box в ваш проект, следуйте инструкции:

  • Скопируйте папку плагина в тему или плагин.


  • Подключите главный файл Meta Box в код вашего проекта. Например, для темы нужно будет вставить следующую строку в файл :

    require get_template_directory() . '/meta-box/meta-box.php';
  • Готово! MetaBox подключен.

Недостатки этого способа:

  • Автоматическое обновление плагина будет невозможно, придется все делать вручную.

  • Если MetaBox уже установлен, ваш плагин или тема не смогут быть активированы — активация вызовет фатальную ошибку PHP.

ВАЖНО: Этот метод не рекомендуется и считается плохой практикой. Используйте его только если хорошо осознаете все последствия

Автор плагина рекомендует первый способ!

Changelog

1.2.6

  • set of fixes and adaptation for PHP 7.3.x
  • adaptation with plugin Content Views — Post Grid & List for WordPress https://wp-filter.com/howto/filtration-for-plugin-content-views-post-grid-list-for-wordpress/

1.2.4

  • minor fixes and adaptation for woocommerce v.3.3.1
  • previous version: https://wp-filter.com/wp-content/uploads/2018/02/wp-meta-data-filter-and-taxonomy-filter-1.2.3.zip

1.2.2

  • https://wp-filter.com/update-v-2-2-2-v-1-2-2/
  • see previous version of the plugin here: https://wp-filter.com/wp-content/uploads/2017/08/wp-meta-data-filter-and-taxonomy-filter-1.2.1.zip

1.2.1

  • Minor fixes
  • New filter item: Multiple checkbox select – in premium only for taxonomies
  • New option: Range slider skin
  • New option: Init plugin scripts on the next site pages only
  • New option: JavaScript code after AJAX is done
  • New option: Sort options by alphabetical order
  • New option: Custom CSS code
  • New feature: Cache terms
  • mdf_search_is_going – CSS class in tag body if searching is going
  • $args = apply_filters(‘mdf_custom_shortcode_query_args’, $args, $custom_id); – wp-filter for shortcode
  • //require plugin_dir_path(FILE) . ‘ext/utilities.php’; – not documented extension in index.php

1.2.0

  • WordPress 4.3 compatibility
  • New shortcode mdf_select_title for drop-down in meta constructor Example: echo do_shortcode(‘’); print_r(MetaDataFilterCore::get_val_as_select_title(139,’medafi_fashion’, ‘africa’));
  • Cron for cleaning dynamic recount cache
  • Different overlay skins in the plugin options for front of site
  • Sort options by alphabetical order for drop-down in meta constructor
  • Keys in drop-down in meta constructor can be with spaces, any customer wants

1.1.9

A lot of improvements. Attention for codecanyon customers – do not update to this version – it is the free one and have less functionality!!! Download your copy of the plugin you bought from codecanyon site only!

1.0.4

Fixed bug with empty result page. To resolve it added new shortcode . It is just enough open in your theme header.php in wordpress editor and drop this shortcode on the same bottom of the file.

Reviews

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>lass=»plugin-reviews»>

… who rate this as anything but 5 stars?

This is an excellent product that does exactly what it says it does. Reliably and simply.

Great for cleaning out bloat on sites with a lot of orders/customers!

Worked perfectly, I had a lot of things left over, most of it was old posts / pages no longer in use that were made with Cornerstone and stored in the database as JSON, and overtime that takes up a lot of space. Backup the database first!

Works perfect. If the feature for orphaned options was available in the free version I would rate the plugin with 5 stars.

Great tool

Works as expected

Reviews

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>lass=»plugin-reviews»>

I have been using this plugin for a few months now and I am impressed with all that it offers, I have the pro version. I would love to see the option in Local Business the option to choose your business and the option to add your postal code — as structured data is the way forward.

I love this plugin. It is on all of my websites and an essential plugin. My entire team use this

Simple and easy to use! Highly recommended.

Easy to use and flexible

Professional solution from one side with the simple configuration from another. Thanks for a great solution!

useful tool for SEO

FAQ

Frequently Asked Questions

  • Can I use the Premium plugin on multiple websites?
  • Does LinkedIn read the Open Graph meta tags?
  • How can I fix a ERR_TOO_MANY_REDIRECTS error?
  • How can I fix a generic HTTP 500 error?
  • How can I fix a PHP fatal “out of memory” error?
  • How can I fix an HTTP error when uploading images?
  • How can I have smaller dimensions for the default image?
  • How can I see what the Facebook crawler sees?
  • How can I share a single NextGEN Gallery image?
  • How do I attach an image without showing it on the webpage?
  • How do I fix Google Structured Data > hatom errors?
  • How do I fix my theme’s front page pagination?
  • How do I install the WPSSO Core Premium plugin?
  • How do I remove duplicate meta tags?
  • How does WPSSO Core find / detect / select images?
  • How does WPSSO Core find / detect / select videos?
  • W3C says “there is no attribute ‘property’”
  • Why are some HTML elements missing / misaligned / different?
  • Why does Facebook show the wrong image / text?
  • Why does Google Structured Data Test Tool show errors?
  • Why is the Open Graph title the same for every webpage?
  • Why shouldn’t I upload small images to the Media library?

Параметр meta_query

Основным параметром для работы с мета-данными в является , который реализован классом . Параметр — это массив, где каждый элемент является в свою очередь массивом с параметрами мета-запроса. Рассмотрим простой пример:

$query = new WP_Query( array(
    'post_type' => 'post',
    'meta_query' => array(
        array(
            'key' => 'mood',
            'value' => 'happy',
        ),
    ),
) );

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

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

Каждый массив в может содержать следующие элементы:

  • — это ключ (или имя) нашего произвольного поля
  • — значение произвольного поля, строкой или массивом
  • — тип сравнения, например: , , , , , , , , , , , , ,
  • — тип значения, например: , , , , , , , ,

Рассмотрим еще один пример с использованием чисел и другого типа сравнения:

$query = new WP_Query( array(
    'post_type' => 'property',
    'meta_query' => array(
        array(
            'key' => 'price',
            'value' => 50000,
            'compare' => '

Здесь мы запрашиваем у записи произвольного типа , где значение произвольного поля меньше или равно 50,000.

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

Несколько запросов meta_query

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

$query = new WP_Query( array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'color',
            'value' => 'red',
        ),
        array(
            'key' => 'size',
            'value' => 'XL',
        ),
    ),
) );

Данный запрос вернет записи типа у которых в произвольных полях указан красный цвет и размер XL. По умолчанию в запросы будут производиться с оператором «и», а не «или», но это легко изменить с помощью аргумента :

$query = new WP_Query( array(
    'post_type' => 'product',
    'relation' => 'OR',
    'meta_query' => array(
        array(
            'key' => 'color',
            'value' => 'red',
        ),
        array(
            'key' => 'color',
            'value' => 'blue',
        ),
    ),
) );

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

$query = new WP_Query( array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'color',
            'value' => array( 'red', 'blue' ),
            'compare' => 'IN',
        ),
    ),
) );

Сортировка с помощью произвольного поля

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

  • — сортировать по значению мета-поля
  • — сортировать по численному значению мета-поля
  • для сортировки по дате, заголовку и другим полям см. нашу статью

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

$query = new WP_Query( array(
    'post_type' => 'auto',
    'meta_key' => 'price',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
) );
$query = new WP_Query( array(
    'post_type' => 'auto',
    'meta_query' => array(
        array(
            'key' => 'color',
            'value' => 'red',
        ),
        array(
            'key' => 'hp',
            'value' => array( 100, 150 ),
            'compare' => 'BETWEEN',
            'type' => 'NUMERIC',
        ),
    ),
    'meta_key' => 'price',
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
) );

Производительность meta_query

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

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

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

Changelog

Release Date: June 8th, 2020


Bugfix: Minor fix to the redirects endpoint.

Release Date: April 30th, 2020

Bugfix: Added support for Yaost SEO 14.0, which has done an extensive rebuild of code.

2020.1.0

Release Date: January 16th, 2020

Bugfix: Fix for custom post types that are registered later in the initialisation process.

Release Date: December 12th, 2019

Bugfix: Fix notice. Bugfix: Proper escaping of special characters.

2019.5.2

Release Date: November 22nd, 2019

Bugfix: Check for at least Yoast SEO 11.* for specific functionality. Feature: Added seperate yoast_title attribute.

2019.5.1

Release Date: November 7th, 2019

Feature: Added filter to be able to remove yoast meta from post types. Bugfix: Fix multiplication of json-ld data. Bugfix: Make sure Twitter meta image displays correct image. Bugfix: Fix homepage endpoint not updating.

Release Date: October 29th, 2019

Feature: Added custom endpoint for retrieving homepage Yoast meta.

Release Date: October 20th, 2019

Bugfix: Transients shouldn’t be set without expiration.

2019.4.1

Release Date: October 18th, 2019

Bugfix: fix inconsistency between DOMDocument and simplexml in parsing json ld data.

Release Date: October 17th, 2019

Feature: Added Yoast SEO’s JSON LD Schema.org data to the WP REST API.

Release Date: October 15th, 2019

Bugfix: Improved HTML parsing using DOMDocument.

Release Date: June 27th, 2019

Bugfix: Yoast meta wasn’t regenerated correctly after a post update.

2019.2.0

Release Date: June 16th, 2019

Improvement: Meet WordPress Coding Standards. Bugfix: Better check if Yoast SEO (Premium) is installed and activated.


С этим читают