Я пытаюсь правильно подготовить свои данные для $ 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). Будет полезно, если кто-нибудь знает, как это сделать, пожалуйста, дайте мне знать.
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
Я также стараюсь найти ответ. если я найду ответ, я также поделюсь своим ответом. Но я не знаю, как подготовить implode ('OR', $ sql). Если это невозможно, и кто-нибудь знает, тогда я должен игнорировать это или попробовать другой подход.
Заранее спасибо…
Благодаря 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);
Приветствия 🙂