WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

pre_get_posts хук-событие . WP 2.0

Событие срабатывает перед каждым запросом WP_Query. До того, как был сделан запрос в базу. Используется для изменения запроса.

Событие pre_get_posts дает возможность изменять объект $wp_query, потому что объект передается в хук по ссылке (&), это означает, что любые действия над $query внутри функции буду влиять на основной объект $wp_query. Для этого хука не надо возвращать никаких данных.

ВАЖНО! pre_get_posts срабатывает для каждого запроса WP_Query: основной запрос, дополнительный запрос, запрос в админ-панели, запросы в виджетах и т.д.

Поэтому нужно убедитесь, что вы изменяете именно нужны вам запрос, для этого перед изменением запроса используйте всевозможные Условные теги, чтобы точно ограничить изменение (см. примеры).

Часто используемые функции внутри хука pre_get_posts:

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

add_action( 'pre_get_posts', 'action_function_name_11' );
function action_function_name_11( $query ) {
	// Действия...
}

Параметры

$query(объект)
Объект WP_Query.

Заметки

Аргумент передается по ссылке

Объект $query предается по ссылке, поэтому нет необходимости определять глобальную переменную. Любые изменения $query внутри функции влияют сразу на оригинальный объект.

Запросы постоянных страниц

pre_get_posts нельзя использовать для изменения запросов связанных с постоянными страницами, потому что 'is_page', 'is_singular', 'pagename' и другие параметры (зависимые к ЧПУ) уже установлены в объекте. Рекомендуется использовать new WP_Query в шаблоне постоянной страницы, чтобы изменить запрос.

Определение нужного запроса

При использовании pre_get_posts, нужно точно определить, в какой конкретно запрос вы вносите изменения. Полезный метод для этого: $query->is_main_query() - он поможет вам убедиться, что вносимые изменения будут влиять только на основные запросы. Используйте его в связке с условными тегами. Чтобы изменять запрос только для страниц, которые вам нужны.

Например, мы хотим изменить запрос на странице категорий и не делаем проверку is_category(), тогда наши изменения будут влиять на формирования запроса в админ-панели, на других страницах сайта и где угодно еще. Поэтому четко определяйте, для какого запроса вы вносите изменения через действие-хук pre_get_posts.

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

Этот фильтр можно также использовать для изменения запросов в админ-панели. В таких случаях, убедитесь что внесенные изменения будут работать на странице вывода записей. Например, проверка $query->is_main_query() и is_post_type_archive('movie') (изменяем запрос для лицевой части для записей типа movie), изменит также запрос на страницы edit.php?post_type=movie. Чтобы этого не произошло, нужно использовать еще проверку ! is_admin().

Внимание! Условные теги

pre_get_posts срабатывает до того, как объект WP_Query полностью определится. Поэтому некоторые условные теги, опирающиеся на данные WP_Query еще не работают. Например, is_front_page() не работает, тогда как is_home() будет работать. Поэтому вам лучше работать с данными объекта напрямую ($query->is_search).

Весь список свойств которые можно использовать вместо условного тега:

$query->is_404
$query->is_admin
$query->is_archive
$query->is_attachment
$query->is_author
$query->is_category
$query->is_comments_popup
$query->is_comment_feed
$query->is_date
$query->is_day
$query->is_feed
$query->is_home
$query->is_month
$query->is_page
$query->is_paged
$query->is_posts_page
$query->is_post_type_archive
$query->is_preview
$query->is_robots
$query->is_search
$query->is_single
$query->is_singular
$query->is_tag
$query->is_tax
$query->is_time
$query->is_trackback
$query->is_year

// функции
$query->is_front_page()
$query->is_main_query()

Все остальные условные теги нужно заменить проверкой или методом класса. Например, is_front_page(), нужно заменить на такую проверку:

if( $query->is_home || ($query->get('page_id') == get_option('page_on_front')) ){
	// это front_page
}

или такой метод:

if( $query->is_front_page() ){
	// это front_page
}

is_main_query() не рекомендуется использовать внутри этого хука. Нужно отдать предпочтение методу $query->is_main_query().

Отступы и пагинация

Использование аргумента offset в любом запросе может сломать пагинацию. Поэтому, если вы используете offset, то вам нужно изменить запрос для всех страниц пагинации, опираясь на первоначальный отступ (offset). Подробнее об этом я писал в этой статье: Как использовать параметр offset не ломая пагинацию.

Примеры

#1 Исключение категорий на главной

Этот пример показывает как убрать посты из указанных категорий из вывода на главной странице блога. Например, у нас есть 2 категории с ID 1 и 1347, которые нам не нужно показывать на главной. Чтобы исключить эти категории из запроса, используйте такой код в плагине или в теме:

function exclude_category( $query ) {
	if ( $query->is_front_page() && $query->is_main_query() ) {
		$query->set( 'cat', '-1,-1347' );
	}
}
add_action( 'pre_get_posts', 'exclude_category' );

#2 Исключение постоянных страниц из результатов поиска

Когда пользователи вашего сайта ищут что-либо, часто в результатах поиска могут попадаться постоянные страницы, которые в принципе совсем не нужны в результатах поиска, и которые можно исключить из поиска насовсем. Используйте хук pre_get_posts, чтобы исключить из результатов поиска постоянных страницы:

function search_filter($query) {
  if ( ! is_admin() && $query->is_main_query() ) {
	if ($query->is_search) {
	  $query->set('post_type', 'post');
	}
  }
}

add_action( 'pre_get_posts', 'search_filter' );

#3 Включение произвольного типа записей в результаты поиска

Включать в поиск произвольный тип записи или нет, устанавливается при регистрации типа записи, в аргументах функции register_post_type(): аргумент public=true добавляет в результат поиска произвольный тип записи.

Если, произвольный тип не включен в поиск, но нужно чтобы он участвовал в поиске, то используйте такой код, аналог предыдущего:

add_action('pre_get_posts', 'get_posts_search_filter');
function get_posts_search_filter( $query ){
	if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
		$query->set('post_type', array('post', 'movie') );
	}
}

#4 Изменение количества выводимых на странице постов

В WordPress есть глобальная настройка, которая учитывает сколько записей показывать на странице - posts_per_page. Лучше всего изменять этот параметр до основного запроса, в целях экономии ресурсов, чтобы не делать повторных запрос. Так, мы можем использовать хук-действие pre_get_posts, чтобы изменить количество выводимых записей на странице.

Этот пример, показывает как перезаписать параметр posts_per_page для страницы архивов произвольного типа записи movie:

add_action('pre_get_posts', 'hwl_home_pagesize', 1 );
function hwl_home_pagesize( $query ) {
	// Выходим, если это админ-панель или не основной запрос.
	if( is_admin() || ! $query->is_main_query() )
		return;

	if( is_home() ){
		// Выводим только 1 пост на главной странице
		$query->set( 'posts_per_page', 1 );
	}

	if( $query->is_post_type_archive('movie') ){
		// Выводим 50 записей если это архив типа записи 'movie'
		$query->set( 'posts_per_page', 50 );
	}
}

Пример объекта WP_Query

Для того, чтобы быстро разобраться как и что использовать, ниже пример объекта WP_Query (global $wp_query), который передается в хук по ссылке (&$query):

WP_Query Object
(
	[query_vars] => Array
		(
			[page] => 0
			[pagename] => s
			[error] => 
			[m] => 
			[p] => 0
			[post_parent] => 
			[subpost] => 
			[subpost_id] => 
			[attachment] => 
			[attachment_id] => 0
			[name] => s
			[static] => 
			[page_id] => 0
			[second] => 
			[minute] => 
			[hour] => 
			[day] => 0
			[monthnum] => 0
			[year] => 0
			[w] => 0
			[category_name] => 
			[tag] => 
			[cat] => 
			[tag_id] => 
			[author] => 
			[author_name] => 
			[feed] => 
			[tb] => 
			[paged] => 0
			[comments_popup] => 
			[meta_key] => 
			[meta_value] => 
			[preview] => 
			[s] => 
			[sentence] => 
			[fields] => 
			[menu_order] => 
			[category__in] => Array
				(
				)

			[category__not_in] => Array
				(
				)

			[category__and] => Array
				(
				)

			[post__in] => Array
				(
				)

			[post__not_in] => Array
				(
				)

			[tag__in] => Array
				(
				)

			[tag__not_in] => Array
				(
				)

			[tag__and] => Array
				(
				)

			[tag_slug__in] => Array
				(
				)

			[tag_slug__and] => Array
				(
				)

			[post_parent__in] => Array
				(
				)

			[post_parent__not_in] => Array
				(
				)

			[author__in] => Array
				(
				)

			[author__not_in] => Array
				(
				)

			[ignore_sticky_posts] => 
			[suppress_filters] => 
			[cache_results] => 
			[update_post_term_cache] => 1
			[update_post_meta_cache] => 1
			[post_type] => 
			[posts_per_page] => 10
			[nopaging] => 
			[comments_per_page] => 10
			[no_found_rows] => 
			[order] => DESC
		)

	[tax_query] => 
	[meta_query] => WP_Meta_Query Object
		(
			[queries] => Array
				(
				)

			[relation] => 
		)

	[date_query] => 
	[post_count] => 1
	[current_post] => -1
	[in_the_loop] => 
	[comment_count] => 0
	[current_comment] => -1
	[found_posts] => 1
	[max_num_pages] => 0
	[max_num_comment_pages] => 0
	[is_single] => 
	[is_preview] => 
	[is_page] => 1
	[is_archive] => 
	[is_date] => 
	[is_year] => 
	[is_month] => 
	[is_day] => 
	[is_time] => 
	[is_author] => 
	[is_category] => 
	[is_tag] => 
	[is_tax] => 
	[is_search] => 
	[is_feed] => 
	[is_comment_feed] => 
	[is_trackback] => 
	[is_home] => 
	[is_404] => 
	[is_comments_popup] => 
	[is_paged] => 
	[is_admin] => 
	[is_attachment] => 
	[is_singular] => 1
	[is_robots] => 
	[is_posts_page] => 
	[is_post_type_archive] => 
	[query_vars_hash] => c248b13e251e8fba33892e0bd7a5bd98
	[query_vars_changed] => 
	[thumbnails_cached] => 
	[stopwords:WP_Query:private] => 
	[query] => Array
		(
			[page] => 
			[pagename] => s
		)

	[queried_object] => WP_Post Object
		(
			[ID] => 19
			[post_author] => 1
			[post_date] => 2010-04-01 20:09:20
			[post_date_gmt] => 2010-04-01 16:09:20
			[post_content] => 
			[post_title] => Страница для исполнения
			[post_excerpt] => 
			[post_status] => private
			[comment_status] => open
			[ping_status] => closed
			[post_password] => 
			[post_name] => s
			[to_ping] => 
			[pinged] => 
			[post_modified] => 2011-04-25 17:44:42
			[post_modified_gmt] => 2011-04-25 13:44:42
			[post_content_filtered] => 
			[post_parent] => 0
			[guid] => http://site.ru/s
			[menu_order] => 0
			[post_type] => page
			[post_mime_type] => 
			[comment_count] => 0
			[filter] => raw
		)

	[queried_object_id] => 19
	[request] => SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  
				 AND (wp_posts.ID = '19') AND wp_posts.post_type = 'page'  
				 ORDER BY wp_posts.post_date DESC 
	[posts] => Array
		(
			[0] => WP_Post Object
				(
					[ID] => 19
					[post_author] => 1
					[post_date] => 2010-04-01 20:09:20
					[post_date_gmt] => 2010-04-01 16:09:20
					[post_content] => 
					[post_title] => Страница для исполнения
					[post_excerpt] => 
					[post_status] => private
					[comment_status] => open
					[ping_status] => closed
					[post_password] => 
					[post_name] => s
					[to_ping] => 
					[pinged] => 
					[post_modified] => 2011-04-25 17:44:42
					[post_modified_gmt] => 2011-04-25 13:44:42
					[post_content_filtered] => 
					[post_parent] => 0
					[guid] => http://site.ru/s
					[menu_order] => 0
					[post_type] => page
					[post_mime_type] => 
					[comment_count] => 0
					[filter] => raw
				)

		)

	[post] => WP_Post Object
		(
			[ID] => 19
			[post_author] => 1
			[post_date] => 2010-04-01 20:09:20
			[post_date_gmt] => 2010-04-01 16:09:20
			[post_content] => 
			[post_title] => Страница для исполнения
			[post_excerpt] => 
			[post_status] => private
			[comment_status] => open
			[ping_status] => closed
			[post_password] => 
			[post_name] => s
			[to_ping] => 
			[pinged] => 
			[post_modified] => 2011-04-25 17:44:42
			[post_modified_gmt] => 2011-04-25 13:44:42
			[post_content_filtered] => 
			[post_parent] => 0
			[guid] => http://site.ru/s
			[menu_order] => 0
			[post_type] => page
			[post_mime_type] => 
			[comment_count] => 0
			[filter] => raw
		)

)

Связи хука

Используется в: WP_Query::get_posts()

Остальные хуки из: WP_Query::get_posts():

Фрагменты кода хука pre_get_posts

Фрагмент из: wp-includes/class-wp-query.php WP 4.8.1
...
		global $wpdb;

		$this->parse_query();

		/**
		 * Fires after the query variable object is created, but before the actual query is run.
		 *
		 * Note: If using conditional tags, use the method versions within the passed instance
		 * (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions
		 * like is_main_query() test against the global $wp_query instance, not the passed one.
		 *
		 * @since 2.0.0
		 *
		 * @param WP_Query &$this The WP_Query instance (passed by reference).
		 */
		do_action_ref_array( 'pre_get_posts', array( &$this ) );

		// Shorthand.
		$q = &$this->query_vars;

		// Fill again in case pre_get_posts unset some vars.
		$q = $this->fill_query_vars($q);

		// Parse meta query
		$this->meta_query = new WP_Meta_Query();
		$this->meta_query->parse_query_vars( $q );

		// Set a flag if a pre_get_posts hook changed the query vars.
		$hash = md5( serialize( $this->query_vars ) );
		if ( $hash != $this->query_vars_hash ) {
			$this->query_vars_changed = true;
...
pre_get_posts 18 комментариев
Вопросы 3 Все
  • Печник Роман cайт: kladka-kamina.ru
    @

    Изменение количества выводимых на странице постов,
    В новой версии WP 3.8 не работает, может есть какой другой способ

    Ответить3.5 года назад #
  • campusboy1737 cайт: wp-plus.ru
    @

    Как правильно будет исключить посты с определенным произвольным полем?

  • campusboy1737 cайт: wp-plus.ru
    @

    Накидал тут маленький плагин для себя, возможно кому-то тоже пригодиться. Основа была взята со статьи "Блок произвольных полей в админке WordPress своими руками". Решил опубликовать сюда, так как исключение определенных записей заслуга pre_get_posts. Итак, после активации плагина появится вот такой виджет при публикации/редактировании поста:

    Код плагина (можно и в function.php поставить, не суть важно):

    <?
    /*
    Plugin Name: Exclude Posts Front Page (epfp)
    Description: Плагин позволяет исключить вывод помеченных постов с главной страницы сайта. Пометка ставиться при публикации/редактировании поста.
    Author: Campusboy
    Author URI: http://wp-plus.ru/
    Version: 1.0
    */
    
    // подключаем функцию активации мета блока
    add_action('add_meta_boxes', 'epfp_fields', 1);
    
    function epfp_fields() {
    	add_meta_box( 'epfp_fields', 'Исключение поста c главной', 'epfp_fields_box_func', 'post', 'normal', 'high'  );
    }
    
    /**
     * Выводит виджет с настройками при публикации/редактировании поста
     * 
     * @param  obj $post объект с данными о публикуемом/редактируемом посте
     */
    function epfp_fields_box_func( $post ){ 
    	$exclude = get_post_meta($post->ID, 'epfp_exclude_post', 1);
    
    	$block  = sprintf('<label><input type="radio" name="epfp[epfp_exclude_post]" value="0" %s /> показывать</label><br>', epfp_checked_radio( 0, $exclude ) );
    	$block .= sprintf('<label><input type="radio" name="epfp[epfp_exclude_post]" value="1" %s /> исключить</label>', epfp_checked_radio( 1, $exclude ) );
    	$block .= sprintf('<input type="hidden" name="epfp_fields_nonce" value="%s" />', wp_create_nonce(__FILE__) );
    
    	echo $block;
     }
    
    /**
     * Проверяет 2 значения и, если они совпадают, выводит атрибут checked для текущих радио-кнопок формы.
     * 
     * @param  string|int   $value          значение value кнопки
     * @param  string|int   $currect        сравнивоемое с value значение
     * @return string                           совпало - атрибут checked="checked", не совпало - пуста
     */
    function epfp_checked_radio( $value, $currect = false ){
    	return ( $value == $currect ) ? 'checked="checked"' : '';
    }
    
    // включаем обновление полей при сохранении
    add_action('save_post', 'my_extra_fields_update', 0);
    
    /**
     * Сохранение данных виджета
     * 
     * @param  int  $post_id    ID редактируемой записи
     * @return int              ID редактируемой записи
     */
    function my_extra_fields_update( $post_id ){
    
    	if ( !isset($_POST['epfp_fields_nonce']) || !wp_verify_nonce($_POST['epfp_fields_nonce'], __FILE__) )
    		return false; // проверка
    
    	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
    		return false; // если это автосохранение
    
    	if ( !current_user_can('edit_post', $post_id) )
    		return false; // если юзер не имеет право редактировать запись
    
    	if( !isset( $_POST['epfp']) )
    		return false;
    
    	// Все ОК! Теперь, нужно сохранить/удалить данные
    	$_POST['epfp'] = array_map('trim', $_POST['epfp']);
    
    	foreach( $_POST['epfp'] as $key=>$value ){
    
    		if( empty($value) ){
    			delete_post_meta($post_id, $key); // удаляем поле если значение пустое
    			continue;
    		}
    
    		update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически
    	}
    
    	return $post_id;
    }
    
    /**
     * Исключает вывод постов из списка "помеченных"
     * 
     * @param  [obj]    $query объект главного запроса WP
     * @return              void
     */
    function epfp_exclude_posts( $query ) {
    	if ( $query->is_front_page() && $query->is_main_query() ) {
    		$query->set(
    			'meta_query', array([ 'key'=>'epfp_exclude_post', 'compare'=>'NOT EXISTS' ])
    		);
    	}
    }
    add_action( 'pre_get_posts', 'epfp_exclude_posts' );

    Тимур, спасибо за помощь в его создании smile

    1
    • Kama4477

      Интересно, я вот так подправил код:

      <?php
      
      /*
      Plugin Name: Exclude Posts Front Page (epfp)
      Description: Плагин позволяет исключить вывод помеченных постов с главной страницы сайта. Пометка ставиться при публикации/редактировании поста.
      Author: Campusboy
      Author URI: http://wp-plus.ru/
      Version: 2.0
      */
      
      // если для главной не установлена отдельная страница или она есть, но есть страница блога, тогда функционал переходит на нее...
      if( ! get_option('page_on_front') || get_option('page_for_posts') ){
      
      	// чекбокс для исключения
      	add_action('post_submitbox_misc_actions', 'epfp_fields_box_func');
      
      	// включаем обновление полей при сохранении
      	add_action('save_post', 'epfp_fields_update', 0);
      
      	// Исключает вывод постов из списка "помеченных"
      	add_action('pre_get_posts', 'epfp_exclude_posts');
      
      	## Выводит виджет с настройками при публикации/редактировании поста
      	function epfp_fields_box_func( $post ){
      		$exclude = get_post_meta( $post->ID, 'epfp_exclude_post', 1);
      
      		echo '
      		<div class="misc-pub-section">
      			<input type="hidden" name="epfp[epfp_exclude_post]" value="" />
      			<label><input type="checkbox" name="epfp[epfp_exclude_post]" value="1" '. checked( 1, $exclude, 0 ) .' /> исключить запись с главной?</label>
      		</div>
      		';
      	 }
      
      	## Сохранение данных виджет
      	function epfp_fields_update( $post_id ){
      		if( !isset($_POST['epfp']) || ! is_admin() || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post_'. $post_id ) )
      			return false; // базовая проверка не пройдена
      
      		if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
      			return false; // автосохранение
      
      		if ( ! current_user_can('edit_post', $post_id) )
      			return false; // юзер не имеет право редактировать запись
      
      		// Все ОК! Теперь, нужно сохранить/удалить данные
      		$epfp = array_map('trim', $_POST['epfp']);
      
      		foreach( $epfp as $key => $value ){
      			if( empty($value) ){
      				delete_post_meta( $post_id, $key ); // удаляем поле если значение пустое
      				continue;
      			}
      
      			update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически
      		}
      
      		return $post_id;
      	}
      
      	## Исключает вывод постов из списка "помеченных"
      	function epfp_exclude_posts( $query ) {
      		if ( $query->is_main_query() && ( $query->is_front_page() || $query->is_home )  ) {
      			$query->set(
      				'meta_query', array([ 'key'=>'epfp_exclude_post', 'compare'=>'NOT EXISTS' ])
      			);
      		}
      	}
      
      }

      П.С. Вместо epfp_checked_radio() можно юзать готовую функцию checked()

      Хорошо бы это дело вынести из комментов куда-нить в вопросы что ли... Вопрос без вопроса напиши, если не сложно...

      2
      • campusboy1737 cайт: wp-plus.ru
        @

        Делал наспех, потому не допетрил, что checked() можно также употреблять, как и мою функцию. Спасибо за правки!

        Единственное, не пойму, как так вышло, что опция попала в верхний виджет, а не осталась обособленной?

        И ещё. Разве этот код не лишний? Ведь если у пользователя нет прав на редактирование поста, то он его даже открыть не сможет, тем самым и виджет не увидит.

        if ( ! current_user_can('edit_post', $post_id) )
          return false; // юзер не имеет право редактировать запись
        • Kama4477

          Единственное, не пойму, как так вышло, что опция попала в верхний виджет, а не осталась обособленной?

          Вместо метабокса этот хук использовал:

          add_action('post_submitbox_misc_actions', 'epfp_fields_box_func');
          • campusboy1737 cайт: wp-plus.ru
            @

            Пойду посплю, такую очевидную вещь не заметил. Ещё раз спасибо за отклик.

            Я там дополнил свой коммент выше одним вопросом, было бы интересно ответ услышать.

            • Kama4477

              И ещё. Разве этот код не лишний? Ведь если у пользователя нет прав на редактирование поста, то он его даже открыть не сможет, тем самым и виджет не увидит.

              Я не уверен что он лишний. Можно конечно убрать, но чисто теоретически: я подбираю _wpnonce код, нахожу подходящую страницу админки для post запроса и отправляю туда данные вместе с $_POST['epfp'] и без этой проверки данные пройдут. Хотя конечно будет странно что я не имея доступа в админку, смогу туда отправить запрос. Это надо код ВП покурить, потом можно ответить, а пока - он особо кушать не просит.

      • campusboy1737 cайт: wp-plus.ru
        @

        Хорошо бы это дело вынести из комментов куда-нить в вопросы что ли...

        Вопрос задан

  • valdus

    Добрый день. Я столкнулся с такой проблемой.
    У меня на сайте должно быть два поиска, один с одной исключенной рубрикой.
    Второй только та рубрика которая исключена из первого поиска.

    function SearchExlude($query) 
    {    
     if ($query->is_search) 
      { $query->set('cat','-27'); }    
     return $query;
     }
    add_filter('pre_get_posts','SearchExlude');

    Нашел такое решение проблемы, но столкнулся с другой.
    Этот методо исключает полностью из поиска данную рубинку (из первого и второго).
    Как можно решить проблему, подскажите.

    Первый поиск находится в шапке сайта, второй в сайдбаре

    • campusboy1737 cайт: wp-plus.ru
      @

      Приветствую. Передавайте в форме ещё один параметр в дополнение к поисковому запросу, к примеру, по которому уже можно решить, в каком случае исключать одно, а в каком другое.

      1
    • Kama4477

      Если эти разные поиски выводятся на разных страницах, то campusboy вам ответил уже.

      Если оба поиска нужно вывести на одной странице в разных блоках. То вам нужно создать 2 запроса. Первый пусть будет основной и в нем вы уже исключили рубрику 27. А второй создавайте с помощью WP_Query там укажите параметр s и рубрику 27, т.е. искать только в рубрике 27...

  • Сергей

    Ребят подскажите новичку функцию или киньте хелпом, вообщем хочу свой плагин постинга в соцсеть написать но не знаю где формируется данные публикуемого поста, в каком файле или точнее в какой глобальной переменной? Где их так сказать ловить и копировать для пуша куда мне нужно?

  • Антон cайт: feedz.ru
    @

    Приветствую!
    А каким образом можно исключить посты с датой менее текущей?
    Использую публикацию отложенных записей, следовательно, есть посты с будущей датой. Необходимо сделать, чтобы при заходе в категорию или метку цикл отдавал только посты с >= текущей даты. Весь мозг уже сломал себе. Как уже только не пробовал!

    Прошу помощи!

  • Дмитрий cайт: list-price.ru/catalog/smartfony

    Делаю фильтр для товаров по произвольным полям.
    Отдельно сделал файл, куда с помощью ajax отправляются запросы, когда выбираю разные чекбоксы, обработчик подсчитывает количество найденных товаров и соответственно количество найденных выводится на экран рядом с кнопкой.

    Возникла проблема, при добавлении большого количества произвольных полей, обработчик перестал считать. Пол дня искал, где я допустил ошибку, а оказывается, что какое-то ограничение на количество запросов.
    Перед WP_Query добавил $wpdb->query('SET OPTION SQL_BIG_SELECTS = 1'); и все заработало.

    Подсечет теперь работает, а вот как изменить глобальный запрос, с этой же кучей произвольных полей(при меньшем количестве все работает, а вот если еще добавить, то перестает).

    Пример куска из файла функций темы

    // количество сим карт
     if ($_GET['sim_in']) 
     {
    $meta_query['meta_query'][1] = array( 'relation'=>'or' );
    $rrr = 0;
    foreach ($_GET['sim_in'] as $sim_ins) {
     $meta_query['meta_query'][1][$rrr++] = array(
    		 'key'    => 'sm_kolichestvo_sim_kart',
    		 'value'   => $sim_ins,
    	 'compare' => '=',
    
    	);
    }
    $query->set( 'meta_query', $meta_query );
    } 
    

    куда здесь запихать $wpdb->query('SET OPTION SQL_BIG_SELECTS = 1');
    пробовал, везде нифига не пашет.

Здравствуйте, !

Ваш комментарий