WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Платформа для конвертации и монетизации трафика
функция не описана

WP_Tax_Query::get_sql_for_clause() public WP 4.1.0

Generate SQL JOIN and WHERE clauses for a "first-order" query clause.

{} Это метод класса: WP_Tax_Query{}

Хуков нет.

Возвращает

Массив. Array containing JOIN and WHERE SQL clauses to append to a first-order query.

  • join(строка)
    SQL fragment to append to the main JOIN clause.

  • where(строка)
    SQL fragment to append to the main WHERE clause.

Использование

$WP_Tax_Query = new WP_Tax_Query();
$WP_Tax_Query->get_sql_for_clause( $clause, $parent_query );
$clause(массив) (обязательный) (передается по ссылке — &)
Query clause (passed by reference).
$parent_query(массив) (обязательный)
Parent query array.

Заметки

  • Global. wpdb. $wpdb The WordPress database abstraction object.

Список изменений

С версии 4.1.0 Введена.

Код WP_Tax_Query::get_sql_for_clause() WP 5.5.3

<?php
public function get_sql_for_clause( &$clause, $parent_query ) {
	global $wpdb;

	$sql = array(
		'where' => array(),
		'join'  => array(),
	);

	$join  = '';
	$where = '';

	$this->clean_query( $clause );

	if ( is_wp_error( $clause ) ) {
		return self::$no_results;
	}

	$terms    = $clause['terms'];
	$operator = strtoupper( $clause['operator'] );

	if ( 'IN' === $operator ) {

		if ( empty( $terms ) ) {
			return self::$no_results;
		}

		$terms = implode( ',', $terms );

		/*
		 * Before creating another table join, see if this clause has a
		 * sibling with an existing join that can be shared.
		 */
		$alias = $this->find_compatible_table_alias( $clause, $parent_query );
		if ( false === $alias ) {
			$i     = count( $this->table_aliases );
			$alias = $i ? 'tt' . $i : $wpdb->term_relationships;

			// Store the alias as part of a flat array to build future iterators.
			$this->table_aliases[] = $alias;

			// Store the alias with this clause, so later siblings can use it.
			$clause['alias'] = $alias;

			$join .= " LEFT JOIN $wpdb->term_relationships";
			$join .= $i ? " AS $alias" : '';
			$join .= " ON ($this->primary_table.$this->primary_id_column = $alias.object_id)";
		}

		$where = "$alias.term_taxonomy_id $operator ($terms)";

	} elseif ( 'NOT IN' === $operator ) {

		if ( empty( $terms ) ) {
			return $sql;
		}

		$terms = implode( ',', $terms );

		$where = "$this->primary_table.$this->primary_id_column NOT IN (
			SELECT object_id
			FROM $wpdb->term_relationships
			WHERE term_taxonomy_id IN ($terms)
		)";

	} elseif ( 'AND' === $operator ) {

		if ( empty( $terms ) ) {
			return $sql;
		}

		$num_terms = count( $terms );

		$terms = implode( ',', $terms );

		$where = "(
			SELECT COUNT(1)
			FROM $wpdb->term_relationships
			WHERE term_taxonomy_id IN ($terms)
			AND object_id = $this->primary_table.$this->primary_id_column
		) = $num_terms";

	} elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) {

		$where = $wpdb->prepare(
			"$operator (
			SELECT 1
			FROM $wpdb->term_relationships
			INNER JOIN $wpdb->term_taxonomy
			ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id
			WHERE $wpdb->term_taxonomy.taxonomy = %s
			AND $wpdb->term_relationships.object_id = $this->primary_table.$this->primary_id_column
		)",
			$clause['taxonomy']
		);

	}

	$sql['join'][]  = $join;
	$sql['where'][] = $where;
	return $sql;
}