Есть ли способ использовать оператор подготовки wpdb для имплозии массива (‘OR’, $ myArray)?

Я пытаюсь правильно подготовить свои данные для $ wpdb

$region = $wpdb->get_results( $wpdb->prepare( "SELECT tr.*, count(*) AS jobs_count FROM {$wpdb->terms} tr
INNER JOIN {$wpdb->term_taxonomy} tm
ON ( tm.term_id = tr.term_id )
INNER JOIN {$wpdb->term_relationships} tmr
ON ( tmr.term_taxonomy_id = tm.term_taxonomy_id )
INNER JOIN {$wpdb->posts} p
ON ( p.ID = tmr.object_id )
WHERE (tm.parent = '%d'
AND tm.taxonomy = '%s'
AND p.post_type = '%s' )
GROUP BY name HAVING COUNT(name) > '%d'
", 0, 'location', 'job', 0 ));

Я пытался это получить название региона. Это точно вернуть данные, как ожидалось. Но здесь регион является родительской таксономией, а страна — дочерним. Поэтому я также хотел подготовить данные для получения списка стран. Но здесь проблема в том, что он ищет под родительским элементом, если он существует. Поэтому я создаю динамический массив для того, что называется $ sql.
Код, который я хочу подготовить, приведен ниже как $ country_query.

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

foreach ($region as $reg) {
$sql[] = " $wpdb->term_taxonomy.parent = '$reg->term_id' ";
}
$country_query = "SELECT $wpdb->terms.*, count(*) AS jobs_count FROM $wpdb->terms
INNER JOIN $wpdb->term_taxonomy
ON ( $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id )
INNER JOIN $wpdb->term_relationships
ON ( $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id )
INNER JOIN $wpdb->posts
ON ( $wpdb->posts.ID = $wpdb->term_relationships.object_id )

WHERE (". implode(' OR ', $sql) ." AND $wpdb->term_taxonomy.taxonomy = 'location' ) AND $wpdb->posts.post_type = 'job'
GROUP BY name HAVING COUNT(name) > 0";

$country = $wpdb->get_results($country_query);

В настоящее время мой запрос выдает этот оператор SQL после использования implode (‘OR’, $ sql) this. Будет полезно, если кто-нибудь знает, как это сделать, пожалуйста, дайте мне знать.

SELECT wp_terms.*, count(*) AS jobs_count FROM wp_terms
INNER JOIN wp_term_taxonomy
ON ( wp_term_taxonomy.term_id = wp_terms.term_id )
INNER JOIN wp_term_relationships
ON ( wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id )
INNER JOIN wp_posts
ON ( wp_posts.ID = wp_term_relationships.object_id )

WHERE ( wp_term_taxonomy.parent = '2'  OR  wp_term_taxonomy.parent = '322'  OR  wp_term_taxonomy.parent = '651'  AND wp_term_taxonomy.taxonomy = 'location' ) AND wp_posts.post_type = 'job'
GROUP BY name HAVING COUNT(name) > 0

Я также стараюсь найти ответ. если я смогу найти какой-либо ответ, я также поделюсь своим ответом. Но дело в том, что я понятия не имею, как подготовить взрыва (‘ИЛИ’, $ sql). Если это невозможно, и кто-то знает, я должен проигнорировать это или попробовать другой подход.

Заранее спасибо…

2

Решение

Благодаря https://stackoverflow.com/users/1704961/mdma для головы. Он говорит мне попробовать IN. Итак, наконец, я нашел ответ от stackoverflow: https://stackoverflow.com/a/10634225/1993427 Это мне очень помогает. 🙂

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

$country = array();

$sql = array();
foreach ($region as $reg) {
$sql[] = $reg->term_id;
}

$test = array("location", "job", "0");$sql_st = "SELECT tr.*, count(*) AS jobs_count FROM {$wpdb->terms} tr
INNER JOIN {$wpdb->term_taxonomy} tm
ON ( tm.term_id = tr.term_id )
INNER JOIN {$wpdb->term_relationships} trm
ON ( trm.term_taxonomy_id = tm.term_taxonomy_id )
INNER JOIN {$wpdb->posts} p
ON ( p.ID = trm.object_id )

WHERE tm.parent IN(".implode(', ', array_fill(0, count($sql), '%s')).") AND tm.taxonomy = '%s' AND p.post_type = '%s'
GROUP BY name HAVING COUNT(name) > '%s'";

$country_query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql_st), $sql, $test));

$country = $wpdb->get_results($country_query);

Ура 🙂

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]