Вопрос или проблема
У меня есть один мета-ключ “игра”, содержащий это мета-значение “игра 1, игра 2”.
Я хотел бы отобразить это мета-значение на своем сайте следующим образом:
<a href="http://www.url.com/game-1">игра 1</a>
<a href="http://www.url.com/game-2">игра 2</a>
Спасибо за вашу помощь.
Если несколько записей хранятся в одном мета-ключе, то get_post_meta()
вернет массив этих значений.
get_post_meta( $post_id, 'game' ); // возвращает ['игра 1', 'игра 2']
Если вы хотите перебрать коллекцию, то просто используйте цикл for в PHP:
$games = get_post_meta( $post_id, 'game' );
foreach( $games as $game ) {
$game_slug = sanitize_title( $game ); // Превращает "игра 1" в "игра-1" для использования в URL
$game_url="http://www.url.com/" . $game_slug;
echo '<a href="' . esc_url( $game_url ) . "'>' . esc_html( $game ) . '</a>';
}
Я добавил экранирование выше как для URL, так и для заголовка, чтобы отрендеренный разметка была как можно безопаснее – мы не хотим, чтобы кто-то внедрил тег script в качестве заголовка игры и захватил сайт 😉
Если мета сохранилась в формате CSV (и это одно мета), используя ту же обработку вывода, что и @EAMann, вы бы сделали это для поля мета с одним значением следующим образом:
$games = get_post_meta( $post_id, 'game', true );
$games = explode(',', $games );
foreach( $games as $game ) {
$game_slug = sanitize_title( $game ); // Превращает "игра 1" в "игра-1" для использования в URL
$game_url="http://www.url.com/" . $game_slug;
echo '<a href="' . esc_url( $game_url ) . "'>' . esc_html( $game ) . '</a>';
}
Ответ или решение
Мультизначения для одного ключа метаданных: практическое решение
В данной статье мы рассмотрим, как обрабатывать ситуацию, когда один ключ метаданных (например, "game") содержит несколько значений, таких как "game 1, game 2". Разберёмся, как правильно вывести эти значения на вашем сайте в виде отдельных ссылок с использованием PHP и WordPress.
Проблема
Давайте начнем с предположения, что вы уже сохранили метаданные в формате, где для ключа "game" установлено значение "game 1, game 2". Вашей задачей является отобразить это значение в виде отдельных ссылок, как показано ниже:
<a href="http://www.url.com/game-1">game 1</a>
<a href="http://www.url.com/game-2">game 2</a>
Решение
Получение метаданных
Если метаданные сохранены корректно, вы можете получить их с помощью функции get_post_meta()
. При этом, если в базе данных хранится массив значений, вызов функции вернет все значения:
$games = get_post_meta( $post_id, 'game' ); // Возвращает ['game 1', 'game 2']
Однако, если вы сохранили метаданные в виде одной строки (например, "game 1, game 2"), вам нужно будет использовать метод, который разобьет эту строку на массив.
Преобразование данных и вывод
Следующий шаг — это пройтись по массиву и сгенерировать нужные ссылки. Вот пример кода, который выполняет указанную задачу:
// Получаем метаданные, используя третий параметр true для возврата одной строки
$games = get_post_meta( $post_id, 'game', true );
// Преобразуем строку в массив, используя разделитель запятую
$games = explode(',', $games);
// Итерируемся по каждому элементу массива
foreach( $games as $game ) {
$game = trim($game); // Удаляем пробелы вокруг значений
$game_slug = sanitize_title( $game ); // Преобразуем "game 1" в "game-1" для использования в URL
$game_url = "http://www.url.com/" . $game_slug;
// Выводим HTML-код с безопасным экранированием
echo '<a href="' . esc_url( $game_url ) . '">' . esc_html( $game ) . '</a><br>';
}
Объяснение кода
- Тримминг значений:
trim($game)
удаляет лишние пробелы, чтобы избежать ошибок с форматированием при создании URL. - Санитизация:
sanitize_title()
преобразует строку в формат, подходящий для использования в URL (заменяет пробелы на дефисы, удаляет специальные символы и т.д.). - Экранирование:
esc_url()
иesc_html()
защищают сайт от XSS-атак, предотвращая вредоносное внедрение скриптов в метаданные.
Заключение
Использование нескольких значений для одного мета-ключа — распространенная практика в WordPress. Зная, как правильно обрабатывать и выводить эти значения, вы можете улучшить пользовательский интерфейс и SEO вашего сайта. Следуйте представленной практике, и ваша интеграция будет не только эффективной, но и безопасной.