Тип извлечения данных «из коробки», который вы можете делать с WordPress, потрясающий … действительно, так оно и есть. Пока это не так. Видите ли, на самом деле существует довольно много сценариев, где вам нужно больше, чем простая функция или тег, чтобы получить нужные данные и преобразовать их во что-то действительно полезное. Пристегните ремни, мы собираемся спрыгнуть с трассы на несколько минут …
Взаимодействие с базой данных для идентификаторов Fun и Profit Category
Сегодня я собираюсь поделиться с вами небольшим фрагментом кода, который я нашел невероятно полезным за последние несколько месяцев … но прежде чем читать дальше, знайте, что это
- … собираюсь углубиться в некоторые вещи базы данных (что может стать проблематичным, если вы новенький разработчик WP)
- … Я собираюсь использовать действительно конкретный пример, чтобы преподавать гораздо большие уроки.
На самом деле, сам пример не имеет смысла … это все о методах, которые мы будем использовать для решения гипотетической проблемы. К концу этого вы узнаете, что практически нет предела тому, что вы можете делать практически с любой частью информации, сохраненной в базе данных WordPress.
О, и потому что это доморощенный материал, я предполагаю, что у кого-то там будет другой способ сделать это. Поделитесь, разглагольствовать, высказаться об этом в разделе комментариев: P У меня все уши!
Наше предположение: у нас есть список слагов категорий (сохраненный из пользовательского метаблока на странице).
Наша проблема: вы не можете использовать категории slugs в query_posts (); но если единственная часть информации, которая у нас есть, это slug, нам нужно найти способ превратить его в нечто, что мы на самом деле можем использовать: идентификаторы категорий. Есть несколько способов преобразования слагов в идентификаторы (get_category_by_slug, get_term_by и т. Д.), Но они не так гибки или мощны, как метод, который я вам покажу. Будут ли они работать, хотя? Да, они будут хорошо работать, и мы обсудим их в конце. Как я уже сказал, мы сходим с трассы на несколько минут здесь … наслаждайтесь поездкой 🙂
Наша цель: преобразовать один фрагмент данных категории в другой, обратившись к базе данных, скомбинировать его с другими подобными частями, чтобы создать массив, а затем превратить этот массив в строку, которую мы можем фактически использовать в других местах нашей темы или плагин.
Гипотетическая проблема: как получить идентификатор категории из категории Slug
Наша гипотетическая проблема включает в себя пользовательский метабокс, который возвращает только категории Slugs. Наша проблема в том, что нам нужно преобразовать их в идентификаторы, прежде чем мы сможем использовать их в query_posts () ;.
Представьте себе: у вас есть настраиваемое поле, назначенное шаблону страницы с именем « category_filter ». Что делает, так это захватывает список категорий, выбранных пользователем из пользовательского мета-блока , и возвращает их категории-слагов . Отлично … слизняки. Что мы будем делать с ними?
Начиная с текущей версии WordPress, нет простого и быстрого способа (по крайней мере, я мог бы найти), который позволял бы вам просто конвертировать слаг-категории в идентификаторы-категории. Что, честно говоря, отстой, потому что такого рода вещи типа «конвертация валюты» удивительно просты, если мы пытаемся сделать то же самое с почтовыми данными (то есть: превращение имени в слаг, слизняк в ID или ID в имя).
В случае постов, все, что вам нужно сделать, это запустить query_posts
или get_posts
и становится довольно легко получить все, что вам нужно. Не так много в случае категорий … но, как и в WordPress, где есть желание, есть способ.
Мы знаем, что данные существуют в нашей базе данных WordPress; Так что, пока у нас есть какой-то способ связать один фрагмент данных (идентификатор категории) с другим (фрагмент категории), мы можем преобразовать его … это потребует немного дополнительных усилий. Вот как выглядят наши данные в таблице базы данных:
Показывает таблицу wp_terms … просто показывает связь между идентификатором категории (term_id) и слагом (показан).
Пример данных по фактической таблице.
Редактировать: Мы собираемся перейти к $ wpdb прямо здесь, но, как отметили несколько комментаторов, вокруг этого есть ярлыки … и когда я говорю ярлыки, я имею в виду, что есть более короткие способы получения идентификатора одной категории. , Что бы мы ни делали в конечном итоге, эти способы на самом деле немного более длинные способы сделать это … но, как я уже упоминал выше, речь идет об изучении нескольких способов ведения дел … поэтому я покажу оба (плюс бонусный метод) в конце!
Представляем $ wpdb->
Взаимодействие с базой данных — это один из самых непонятных разделов кодекса WordPress, но он включает в себя только ту информацию, которая нам понадобится для преобразования (и выучить новый необычный трюк, который мы можем использовать в самых разных ситуациях). , Вот основы:
Вы можете использовать объект $ wpdb, чтобы «общаться» с любой таблицей в базе данных WordPress. Если вы когда-нибудь вообще работали с MySQL, вы узнаете некоторые способы, как это делается, поскольку все это делается с использованием версии класса ezSQL. Например, функция query
позволяет вам выполнить любой запрос SQL к базе данных WordPress.
1
|
<?php $wpdb->query(‘query’);
|
Вы можете прочитать больше о $ wpdb-> query на странице кодекса … Сегодня мы немного уточним и будем использовать следующее:
1
|
<?php $wpdb->get_var(‘query’,column_offset,row_offset);
|
Из кодекса: функция get_var
возвращает одну переменную из базы данных. Хотя возвращается только одна переменная, весь результат запроса кэшируется для последующего использования …
Отлично! Это означает, что мы можем по существу получить НИЧЕГО внутри базы данных WordPress, пока мы знаем, где его найти … и мы просто знаем, где найти наш ID категории, потому что мы уже знаем Slug Category. Следите за мной еще?
Извлечение идентификатора одной категории из пула одной категории
Вот где становится жарко и тяжело. Используя наш пример, где мы знаем слаг категории, мы можем извлечь идентификатор следующим образом:
1
2
|
$cats = get_post_custom_values(‘category_filter’);
$catid = $wpdb->get_var(«SELECT term_id FROM $wpdb->terms WHERE slug=’$cat'»);
|
Это вернет один идентификатор категории ( term_id, как он известен в БД) и сохранит его в нашей переменной $ catid . В некоторых ситуациях мы могли бы закончить … вы можете просто echo
$ catid, где бы вы ни хотели. В нашем примере у нас еще есть работа.
Для ясности, исходная переменная $ cats захватывает слагов категории из нашего настраиваемого поля … вы можете вставить слагов и другими методами … но вам нужен способ получить слагов (или какой-то фрагмент данных) что ассоциируется с нашим удостоверением личности).
Получение нескольких идентификаторов категорий из нескольких слагов категорий
Давайте теперь расширим наш небольшой фрагмент, допуская более одной категории, используя быстрый цикл foreach
:
1
2
3
4
5
6
7
|
$cats = get_post_custom_values(‘category_filter’);
foreach ( $cats as $cat ) {
$catid = $wpdb->get_var(«SELECT term_id FROM $wpdb->terms WHERE slug=’$cat'»);
$acats
[] = $catid;
}
|
Этот последний фрагмент кода ($ acats …) использует простой PHP, чтобы превратить каждый найденный нами идентификатор категории в часть массива … что может быть полезно для вас. Но давайте сделаем еще один шаг и преобразуем массив в строку (потому что большинство функций в WordPress используют строки).
Преобразование массива в строку, разделенную запятыми, используя Join ();
Мы приближаемся сейчас! Давайте использовать немного более простой PHP для преобразования массива идентификаторов категорий, которые мы создали, в строку, которую мы можем использовать в query_posts.
01
02
03
04
05
06
07
08
09
10
|
$cats = get_post_custom_values(‘category_filter’);
foreach ( $cats as $cat ) {
$catid = $wpdb->get_var(«SELECT term_id FROM $wpdb->terms WHERE slug=’$cat'»);
$acats
[] = $catid;
}
$cat_string = join(‘,’, $acats);
//echo $cat_string;
|
Обратите внимание на последнюю строку, где вы можете удалить «//» для проверки вашего вывода в этой точке, которая должна быть последовательностью чисел (идентификаторов категорий), например: 11, 123, 198, 210 …
Вы можете прочитать о том, как работает функция PHP ‘join’ прямо здесь , но все, что вам действительно нужно знать, это то, что мы просто превратили наш массив идентификаторов категорий в строку, где каждый идентификатор отделен запятой … Это удобно, потому что это именно то, что нам нужно для нашего последнего шага …
Положить все это вместе с Query_Posts ();
Давайте рассмотрим, прежде чем большой раскрыть. Мы взяли известное значение (наши слагаемые категории), превратили их в идентификаторы категорий, запросив базу данных, затем соединили наши идентификаторы категорий в строку, которую мы можем использовать в query_posts()
; Все хорошо? Хорошо, вот как все это выглядит:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
$cats = get_post_custom_values(‘category_filter’);
foreach ( $cats as $cat ) {
$catid = $wpdb->get_var(«SELECT term_id FROM $wpdb->terms WHERE slug=’$cat'»);
$acats
[] = $catid;
}
$cat_string = join(‘,’, $acats);
//echo $cat_string;
$args=array(
‘cat’=>$cat_string, // Query for the cat ID’s (because you can’t use multiple names or slugs… crazy WP!)
);
query_posts($args);
|
Неплохо, верно? Мы готовы к действию — теперь мы можем использовать это в базовом цикле постов If / While , чтобы распределять посты, которые имеют только идентификаторы определенной категории , для которых пользователь выбрал флажки (помните изображение флажка вверху? ).
Полный фрагмент
Хорошо, большое раскрытие! Нам просто нужно добавить несколько дополнительных мер безопасности, чтобы убедиться, что мы можем использовать / повторно использовать этот фрагмент. Нам нужно убедиться, что настраиваемое поле » category_filter » существует (всегда есть вероятность, что пользователь вообще не выберет какие-либо категории). Если он не существует, нет смысла бегать по кругу … поэтому мы будем использовать простую оболочку if / then, чтобы запускать наш фрагмент только тогда, когда существует настраиваемое поле:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
if(get_post_custom_values(‘category_filter’)) : // If the category filter exists on this page…
$cats = get_post_custom_values(‘category_filter’);
foreach ( $cats as $cat ) {
$catid = $wpdb->get_var(«SELECT term_id FROM $wpdb->terms WHERE slug=’$cat'»);
$acats
[] = $catid;
}
$cat_string = join(‘,’, $acats);
//echo $cat_string;
endif;
?>
<?php
$args=array(
‘cat’=>$cat_string, // Query for the cat ID’s (because you can’t use multiple names or slugs… crazy WP!)
);
query_posts($args);
?>
|
Этот фрагмент предполагает, что у вас есть настраиваемое поле с именем » category_filter «, назначенное вашему сообщению … но вы можете Franken-кодировать этот фрагмент, чтобы делать практически все, что вы хотите. Ладно, может быть, это не сделает тебя саммичем … но это все еще довольно изящный фрагмент.
Практический пример
Видишь эти картинки? Каждый из них — это запись в блоге, которая была взята из нашего пользовательского query_posts (); установка … Видите ли, слизни категории не совсем бесполезны в конце концов! Посмотреть полный пример .
Например, я использовал этот фрагмент, чтобы сформировать основу для настраиваемого фильтруемого шаблона страницы портфолио в моей последней теме WordPress SuperSkeleton . «Шаблон страницы портфолио» включает в себя список флажков категорий, который позволяет пользователю выбрать, какие категории публикаций портфолио он хочет показать на странице. Рабочий процесс такой же, я просто добавляю некоторые дополнительные повороты после использования query_posts () ;.
- Категория Слизни …
- Преобразованы в идентификаторы категорий …
- Используется в Query_Posts …
-
Прибыль !!!Фильтруемый шаблон страницы портфолио
Вы можете использовать это для множества разных вещей, хотя … фактически, практически в любом случае, когда вам нужно создать шаблон страницы, который запрашивает определенную категорию, может использовать это.
Зачем использовать $ wpdb?
Две причины Прежде всего, я не мог заставить работать предпочтительные методы get_category_by_slug и get_term_by в моем случае, потому что они просто не возвращали то, что мне было нужно, чтобы получить множество этих вещей (они отлично работали для захвата отдельных категорий, когда я знал категорию слизень … но что, если я не хочу жестко кодировать слизняк?
Вторая причина — образовательная … это небольшое обходное упражнение по решению проблем дает мне возможность написать кое-что о $ wpdb, который является сильно недооцененным методом при попытке манипулировать и извлекать очень специфическую информацию из базы данных. Честно говоря, из-за того, что вы можете запускать прямые SQL-запросы, используя его, трудно найти то, что он не может сделать.
Да, и миниатюра для этого поста — Уилл Смит поет песню рэпа … Я надеюсь, что вы не ожидали ничего слишком официального: P Это хорошее чистое веселье, и никто не говорит, что это единственный способ схватить то, что мы сделали … на самом деле, вот еще несколько идей:
Альтернативные методы без $ wpdb
Использование Get_Category_By_Slug ();
Спасибо Andrew за то, что вы также можете использовать более конкретную функцию для преобразования категории Slug в ID с помощью get_category_by_slug (); , Проверьте страницу кодекса для этого, и вы можете посмотреть, как наш код будет выглядеть ниже:
Простая версия:
1
2
3
4
|
<?php
$idObj = get_category_by_slug(‘category-name’);
$id = $idObj->term_id;
?>
|
Наша версия (которая все еще длинна, но вы можете видеть, где мы используем get_category_by_slug () вместо $ wpdb-> в качестве нашего инструмента сбора данных:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php
if(get_post_custom_values(‘category_filter’)) : // If the category filter exists on this page…
$cats = get_post_custom_values(‘category_filter’);
foreach ( $cats as $cat ) {
$idObj = get_category_by_slug(‘$cat’);
$id = $idObj->term_id;
$acats
[] = $id;
}
$cat_string = join(‘,’, $acats);
//echo $cat_string;
endif;
?>
<?php
$args=array(
‘cat’=>$cat_string, // Query for the cat ID’s (because you can’t use multiple names or slugs… crazy WP!)
);
query_posts($args);
?>
|
Еще один метод с использованием Get_Term_By ();
Наконец, как Томас часто упоминал в комментариях, это во многом похоже на «программный эквивалент перехода из Рочестера, штат Нью-Йорк в Бостон через Wheeling WV» …. Вы можете использовать следующую страницу кодекса для получения дополнительной информации об этом методе. Есть даже встроенная функция для построения нашего массива, которая помогает нам пропустить шаг в этом случае:
1
|
$myCategory = get_term_by(‘id’, $postCategories[0]->cat_ID, ‘category’);
|
Мы могли бы просто пройти мимо нашего слизняка и быть на нашем веселом пути;)
Завершение
Да, это был очень конкретный пример с некоторыми очень конкретными предположениями заранее … но, если вы все еще продолжаете следовать в этом пункте, вы должны были успешно узнать кое-что о следующем:
- Как использовать $ wpdb для выполнения SQL-запросов к базе данных WordPress (в нашем примере извлечение идентификатора категории из слагаемого категории, но вы можете сделать намного больше, чем это)
- Как запустить цикл foreach для списка категорий и сохранить их в массиве
- Преобразовать массив идентификаторов категорий в строку через запятую для использования в query_posts ();
Примечание Хеклера: Да, если бы мы начали с идентификаторов категорий в первую очередь, нам никогда не пришлось бы беспокоиться об этом долгом и сложном процессе … но тогда это не было бы очень обучающим учебником, не так ли? ; P Только время (и ваши комментарии) покажет, действительно ли это лучший способ приблизиться к этому, но, надеюсь, вы знаете немного больше о WordPress сейчас! Спасибо за прочтение!