Статьи

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

В этой серии мы рассмотрели ряд API-интерфейсов метаданных, предлагаемых WordPress. Это включает в себя Post Meta API и User Meta API. Сегодня мы собираемся завершить серию, рассмотрев Мета API WordPress Comment.

Обратите внимание, что это то, что предлагает финальный API метаданных WordPress. Начиная с WordPress 4.4, теперь есть API-интерфейс метаданных термина. Чтобы полностью понять это, важно понимать таксономии, термины и их отношения в контексте WordPress. В следующей серии я расскажу именно об этом.

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

Если вы все попались, тогда давайте начнем.

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

В частности, мы сказали :

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

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

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

И, как вы увидите, это по-прежнему относится к API метаданных комментариев.

Как и в случае с другими API, которые мы рассматривали в этой серии, мы рассмотрим четыре основные функции:

  • add_comment_meta
  • update_comment_meta
  • get_comment_meta
  • delete_comment_meta

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

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

Для остальной части этой статьи я предполагаю следующее:

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

Как я использовал в предыдущих статьях, я использую следующие приложения:

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

Пустая таблица метаданных комментариев

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

Это хорошо, так как даст нам своего рода чистый лист, который можно использовать при рассмотрении различных функций API. Обратите внимание, что для всех приведенных ниже примеров мы собираемся убедиться, что все это происходит в Hello World! Почта. Этот пост имеет ID 1 . Если вы хотите использовать другую страницу, просто замените 1 идентификатором соответствующего сообщения.

Со всем этим, давайте начнем смотреть на то, что доступно.

Чтобы начать добавлять метаданные в наши комментарии, важно взглянуть на таблицу wp_comments чтобы увидеть, какие комментарии уже существуют. Если вы работаете с новой установкой WordPress, вы, вероятно, увидите одну запись:

Единственный комментарий WordPress по умолчанию

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

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

Как и в случае с другими API, которые мы рассмотрели в этой серии, добавление метаданных к комментариям осуществляется в двух формах: уникальной и неуникальной. Мы собираемся рассмотреть оба.

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

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

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_add_unique_comment_meta’ );
function tutsplus_add_unique_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_comment_meta( 1, ‘twitter_handle’, ‘tommcfarlin’, true );
    }
 
    return $content;
 
}

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

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

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_add_comment_meta’ );
function tutsplus_add_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_comment_meta( 1, ‘random_value’, rand() );
    }
 
    return $content;
 
}

А затем обновите страницу, скажем, три раза. Если все идет так, как ожидалось, вы можете увидеть три новые записи, каждая из которых содержит случайное число, сгенерированное вызовом rand() в аргументе meta value.

Несколько значений с одним мета-ключом

Достаточно легко держать прямо, верно? Если вам нужно одно значение, связанное с одним ключом, то передайте true в качестве необязательного четвертого аргумента; в противном случае не указывайте ничего.

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

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_update_comment_meta’ );
function tutsplus_update_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_comment_meta( 1, ‘unique_value’, time() );
    }
 
    return $content;
 
}

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

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

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

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

Обновленное случайное значение, связанное с несколькими ключами

И укажите это как предыдущее значение в следующем коде:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_update_specific_meta’ );
function tutsplus_update_specific_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_comment_meta( 1, ‘unique_value’, time(), ‘17123683’ );
    }
 
    return $content;
 
}

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

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

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

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

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

Функция get_comment_meta требует три аргумента и необязательный четвертый в зависимости от того, что вы хотите получить.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
add_filter( ‘the_content’, ‘tutsplus_get_comment_meta’ );
function tutsplus_get_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
 
        $arr_metadata = get_comment_meta( 1, ‘unique_value’, true );
        var_dump( $arr_metadata );
 
    }
 
    return $content;
 
}

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
add_filter( ‘the_content’, ‘tutsplus_get_one_comment_meta’ );
function tutsplus_get_one_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
 
        $arr_metadata = get_comment_meta( 1, ‘random_value’, true );
        var_dump( $arr_metadata );
 
    }
 
    return $content;
 
}

И полученное значение будет выглядеть примерно так:

1
string(9) «967432645»

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

Единственное отличие состоит в том, что первый пример был извлечен из набора из нескольких записей, а второй пример был извлечен из одной записи. Также обратите внимание, что если вы имеете дело с уникальным значением, оно все равно будет возвращено вам как массив, но как отдельный индексный массив.

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

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

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

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

Чтобы удалить уникальное значение, мы просто передаем идентификатор комментария и метаключ:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_remove_unique_comment_meta’ );
function tutsplus_remove_unique_comment_meta( $content ) {
 
        if ( 1 === get_the_ID() ) {
            delete_comment_meta( 1, ‘unique_value’ );
        }
 
        return $content;
 
}

Перед запуском этого кода база данных должна выглядеть примерно так:

Метаданные в таблице метаданных комментариев

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

Уникальное значение было удалено

Мы поговорим немного больше о мерах предосторожности при удалении данных в следующем разделе.

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

То есть, если вы просто передадите идентификатор комментария и мета-ключ в функцию delete_comment_meta , он удалит все фрагменты метаданных комментария. Напишите и выполните следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_remove_comment_metadata’ );
function tutsplus_remove_comment_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_comment_meta( 1, ‘random_value’ );
    }
 
    return $content;
 
}

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

В таблице метаданных комментариев нет случайных значений

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

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

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

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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<?php
/**
 * This file shows how to work with the common Comment Meta API functions.
 *
 * Namely, it demonstrates how to use:
 * — add_comment_meta
 * — update_comment_meta
 * — get_comment_meta
 * — delete_comment_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:
 * https://code.tutsplus.com/tutorials/how-to-work-with-wordpress-post-metadata—cms-25715
 *
 * @version 1.0.0
 * @author Tom McFarlin
 * @package tutsplus_wp_metadata
 */
 
/* add_filter( ‘the_content’, ‘tutsplus_add_unique_comment_meta’ );
/**
 * Adds a unique meta key and meta value for a user’s Twitter handle
 * to the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_add_unique_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_comment_meta( 1, ‘twitter_handle’, ‘tommcfarlin’, true );
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_add_comment_meta’ );
/**
 * Adds a unique meta key and random meta value
 * to the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_add_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_comment_meta( 1, ‘random_value’, rand() );
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_update_comment_meta’ );
/**
 * Updates unique meta key and unique meta value for
 * to the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_update_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_comment_meta( 1, ‘unique_value’, time() );
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_update_specific_meta’ );
/**
 * Updates a unique meta key and random meta value with a specified value
 * to the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_update_specific_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_comment_meta( 1, ‘random_value’, time(), ‘17123683’ );
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_get_comment_meta’ );
/**
 * Gets an array of the comment metadata associated with the meta key
 * in the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_get_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
 
        $arr_metadata = get_comment_meta( 1, ‘unique_value’ );
        var_dump( $arr_metadata );
 
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_get_all_comment_meta’ );
/**
 * Gets an array of all the meta values associated with the specified meta key
 * in the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_get_all_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
 
        $arr_metadata = get_comment_meta( 1, ‘random_value’ );
        var_dump( $arr_metadata );
 
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_get_one_comment_meta’ );
/**
 * Gets a single value from a set of values associated with a meta key
 * in the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_get_one_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
 
        $arr_metadata = get_comment_meta( 1, ‘random_value’, true );
        var_dump( $arr_metadata );
 
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_remove_unique_comment_meta’ );
/**
 * Removes a unique meta value associated with the specified key
 * to the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_remove_unique_comment_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_comment_meta( 1, ‘unique_value’ );
    }
 
    return $content;
 
}
 
/* add_filter( ‘the_content’, ‘tutsplus_remove_comment_metadata’ );
/**
 * Removes all meta values associated with the specified key
 * to the comment metadata table associated with the comment having
 * the ID of 1.
 *
 * @param string $content The content of the post.
 * @return string $content THe content of the post.
 */
function tutsplus_remove_comment_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_comment_meta( 1, ‘random_value’ );
    }
 
    return $content;
 
}

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

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

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

Любой из них облегчит работу со всем кодом, который мы рассмотрели до сих пор.

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

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

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

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

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

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

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