Статьи

Как работать с метаданными пользователя WordPress

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

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

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

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

Метаданные обрабатываются парами ключ / значение. Ключ — это имя элемента метаданных. Значение — это информация, которая будет отображаться в списке метаданных на каждом отдельном посте, с которым связана эта информация.

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

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

При изучении Word Meta API WordPress мы рассмотрели и использовали следующие функции:

  • add_post_meta
  • update_post_meta
  • get_post_meta
  • delete_post_meta

Да, среди них есть свои особенности, особенно в связи с тем, как add_post_meta и update_post_meta а также с различными способами работы get_post_meta и delete_post_meta , и API-интерфейсы, которые мы собираемся исследовать, будут работать аналогичным образом.

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

Если вам интересно, я буду использовать следующий набор инструментов:

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

wp_usermeta

Это связано с тем, что некоторые данные хранятся на экране профиля пользователя:

Экран профиля пользователя

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

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

Вы можете найти ссылку на функцию add_user_meta в Кодексе . Определение функции максимально кратко:

Добавить метаданные в запись пользователя.

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

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

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

То же самое возможно, используя add_user_meta . Однако функция API принимает необязательный четвертый параметр того, должно ли вставляемое значение быть уникальным или нет.

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

Код для этого будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
add_filter( ‘the_content’, ‘tutsplus_add_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * adds non-unique user meta data to the database.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_add_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/tommcfarlin/’ );
    }
 
    return $content;
 
}

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

  1. Мы подключаемся к the_content .
  2. Мы проверяем, находимся ли мы на Привет Мир пост.
  3. Если это так, мы добавляем метаданные пользователя.
  4. Мы возвращаем $content в WordPress.

После установки этого кода и загрузки сообщения Hello World в ваш браузер обновите страницу несколько раз.

После этого результирующая таблица базы данных будет выглядеть так:

Неуникальные метаданные

Как я уже сказал, это очень похоже на работу API пост-метаданных.

Используя интерфейс базы данных, удалите созданные строки или не стесняйтесь выбирать новый ключ (возможно, что-то вроде instagram_username ). Я собираюсь удалить строки.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
add_filter( ‘the_content’, ‘tutsplus_unique_add_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * adds unique user meta data to the database.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_unique_add_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/tommcfarlin/’, true );
    }
 
    return $content;
 
}

Во-первых, укажите уникальное значение для мета-значения (или третьего аргумента) в вызове функции. Обновите страницу несколько раз, а затем посмотрите на базу данных. Это должно выглядеть примерно так:

Несколько записей

Заметьте, что интересно? Есть еще несколько значений, но они все одинаковы.

Теперь попробуйте изменить аргумент мета-значения пару раз, а затем взгляните на базу данных, и вы должны увидеть что-то вроде этого:

Уникальные метаданные

Заметили разницу? Точно — нет ни одного. Это потому, что мы сказали, что может быть только уникальный ключ. Так что это не обязательно означает, что создается только одна запись. Это означает, что при вызове функции будет создано несколько записей, но она всегда будет использовать первое сохраненное значение, связанное с указанным ключом.

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

Аналогично тому, как работает Post Meta API, функциональность обновления работает следующим образом:

Обновить пользовательское метаполе на основе идентификатора пользователя. Используйте параметр $ prev_value, чтобы различать метаполя с одинаковым ключом и идентификатором пользователя. Если мета-поле для пользователя не существует, оно будет добавлено.

При работе с этой функцией полезно думать об этом в двух сценариях:

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

В первом случае это помогает предоставить значение $prev_value потому что вы сообщаете WordPress, какое значение нужно $prev_value и обновить.

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

База данных

И мы хотим обновить записи, которые имеют предыдущее значение https://twitter.com/tommcfarlin/ . Для этого мы обновим код, который выглядит следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
add_filter( ‘the_content’, ‘tutsplus_update_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * updates user meta data with the specified previous value.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_update_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/tutspluscode/’, ‘https://twitter.com/tommcfarlin/’ );
    }
 
    return $content;
 
}

И тогда обновление базы данных будет выглядеть так:

Обновление метаданных пользователя

Обратите внимание, что при этом обновляются все значения, связанные с этим мета-ключом. Конечно, это только одно использование функции.

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

Чтобы уточнить, вы можете использовать функцию update_user_meta когда вы хотите добавить информацию в базу данных. Это не должно существовать до его использования.

Это полезно всякий раз, когда вы хотите добавить одну уникальную запись, которая еще не добавлена ​​в базу данных. Использовать функцию просто. Допустим, мы хотим сохранить имя брата пользователя.

В этом случае мы бы сделали это:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
add_filter( ‘the_content’, ‘tutsplus_unique_update_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * updates user meta data with the specified value.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_unique_update_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_user_meta( 1, ‘siblings_name’, ‘Ben’ );
    }
 
    return $content;
 
}

В результате в базу данных заносится следующая запись:

Обновление метаданных пользователя

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

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

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

Но как насчет мета стоимости?

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

Но что произойдет, если у разработчика будет несколько записей для одного ключа? В частности, что если они использовали функцию add_user_meta как мы делали выше, и имели несколько записей?

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

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

Неуникальные метаданные

Чтобы вывести всю эту информацию из базы данных и отобразить на экране, мы будем использовать следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
add_filter( ‘the_content’, ‘tutsplus_get_all_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * retrieves all user meta data for the admin user and the specified key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_get_all_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        var_dump( get_user_meta( 1, ‘twitter_account’ ) );
    }
 
    return $content;
 
}

Если предположить, что все прошло хорошо, то вы должны увидеть что-то вроде этого в верхней части своего сообщения Hello World :

1
{ [0]=> string(32) «https://twitter.com/tommcfarlin/» [1]=> string(32) «https://twitter.com/tommcfarlin/» [2]=> string(32) «https://twitter.com/tommcfarlin/» [3]=> string(32) «https://twitter.com/tommcfarlin/» }

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
 
add_filter( ‘the_content’, ‘tutsplus_get_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * retrieves a single record of user meta data for the admin user and
 * the specified key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_get_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        echo esc_textarea( get_user_meta( 1, ‘twitter_account’, true ) );
    }
 
    return $content;
 
}

И результат этого кода напечатает это наверху сообщения Hello World, из которого мы работали:

1
https://twitter.com/tommcfarlin/

Обратите внимание, что если вы используете update_user_meta и не указываете true в качестве последнего параметра, вы получите массив с одним индексом, который будет возвращен вам.

1
array(1) { [0]=> string(32) «https://twitter.com/tommcfarlin/» }

Таким образом, если вы ищете строковое представление информации, всегда передавайте true .

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

С сопровождающей его страницы Кодекса :

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

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

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

Несколько записей

Здесь у нас есть несколько записей. Чтобы удалить записи, имеющие один и тот же ключ, мы используем один вызов функции delete_user_meta и передаем идентификатор пользователя и мета-ключ.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
 
add_filter( ‘the_content’, ‘tutsplus_delete_all_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * deletes all associated meta data with the specified key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_delete_all_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_user_meta( 1, ‘twitter_account’ );
    }
 
    return $content;
}

И если вы обновите информацию в таблице базы данных, вы заметите, что все записи были удалены:

Все записи стерты

Хотя это простая в использовании функция, важно помнить, что она может удалять несколько строк за один вызов, поэтому используйте ее с осторожностью.

Если, с другой стороны, вам нужно удалить одну запись, вам потребуется три элемента информации:

  1. идентификатор пользователя
  2. мета ключ
  3. мета значение

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

Итак, в нашем примере предположим, что у нас есть две записи, каждая из которых имеет мета-ключ twitter_account . Каждый ключ имеет следующее значение:

  1. https://twitter.com/tommcfarlin
  2. https://twitter.com/pressware
Несколько учетных записей Twitter

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
 
add_filter( ‘the_content’, ‘tutsplus_delete_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * deletes a single record based on the specified meta key and meta value.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_delete_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/pressware’ );
    }
 
    return $content;
}

И затем, если вы обновите свою базу данных, вы должны увидеть следующее (или что-то подобное):

Единственная запись остается

Приятно, когда API работает точно так, как вы ожидаете.

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

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
/**
 * This file shows how to work with the common User Meta API functions.
 *
 * Namely, it demonstrates how to use:
 * — add_user_meta
 * — update_user_meta
 * — get_user_meta
 * — delete_user_meta
 *
 * Each function is hooked to ‘the_content’ so that line will need to be
 * commented out depending on which action you really want to test.
 *
 * Also note, from the tutorial linked below, that this file is used form
 * demonstration purposes only and should not be used in a production
 * environment.
 *
 * Tutorial:
 * http://code.tutsplus.com/tutorials/how-to-work-with-wordpress-user-metadata—cms-25800
 *
 * @version 1.0.0
 * @author Tom McFarlin
 * @package tutsplus_wp_metadata
 */
 
// add_filter( ‘the_content’, ‘tutsplus_add_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * adds non-unique user meta data to the database.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_add_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/pressware’ );
    }
 
    return $content;
}
 
// add_filter( ‘the_content’, ‘tutsplus_unique_add_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * adds unique user meta data to the database.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_unique_add_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/photomatt/’, true );
    }
 
    return $content;
}
 
// add_filter( ‘the_content’, ‘tutsplus_update_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * updates user meta data with the specified previous value.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_update_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/tutspluscode/’, ‘https://twitter.com/tommcfarlin/’ );
    }
 
    return $content;
}
 
// add_filter( ‘the_content’, ‘tutsplus_unique_update_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * updates user meta data with the specified value.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_unique_update_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_user_meta( 1, ‘siblings_name’, ‘Ben’ );
    }
 
    return $content;
}
 
// add_filter( ‘the_content’, ‘tutsplus_get_all_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * retrieves all user meta data for the admin user and the specified key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_get_all_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        var_dump( get_user_meta( 1, ‘twitter_account’ ) );
    }
 
    return $content;
}
 
// add_filter( ‘the_content’, ‘tutsplus_get_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * retrieves a single record of user meta data for the admin user and
 * the specified key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_get_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        var_dump( get_user_meta( 1, ‘twitter_account’ ) );
    }
 
    return $content;
}
 
// add_filter( ‘the_content’, ‘tutsplus_delete_all_user_meta’ );
/**
* Determines if the current post is the default ‘Hello World’ post and, if so,
* deletes all associated meta data with the specified key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_delete_all_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_user_meta( 1, ‘twitter_account’ );
    }
 
    return $content;
}
 
add_filter( ‘the_content’, ‘tutsplus_delete_user_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * deletes a single record based on the specified meta key and meta value.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_delete_user_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_user_meta( 1, ‘twitter_account’, ‘https://twitter.com/pressware’ );
    }
 
    return $content;
}

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

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

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

Конечно, это все еще оставляет нам метаданные, связанные с таксономиями. Из-за характера таксономий, терминов и API мы рассмотрим их в последующих сериях.

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

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

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

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

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

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