Поддержка Проблемы и решения Как в WordPress отфильтровать записи в основном цикле по дате?

  • Приветствую!
    Прошу помощи с функцией для Вордпресс. Есть необходимость скрывать посты/записи из основного цикла с фильтрацией по дате.

    Конкретно необходимо следующее: при обращении к страницам таксономий и рубрик, функция сверяет текущую дату с датой поста и если дата записи «устарела» , то запись в цикле не выводится, а посты с текущей датой и запланированной (они через функцию видимы пользователям) наоборот.

    Есть, например, такие функции, которые исключают посты по категории:

    // фильтр скрытых рубрик
    function hidecategory($query) {
    if ( $query->is_home ) {
      $query->set('cat','-1,-7');
      }
    return $query;
    }
    add_filter('pre_get_posts', 'hidecategory');

    Вот по типу такого и нужно что-то придумать. Копался и через compare и другими способами — не получается.

    Прошу помочь!

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • 
    <?php
    function wpse54142_filter_pre_get_posts( $query ) {
        if ( $query->is_home() && $query->is_main_query() ) {
            $today = getdate();
            $query->set( 'year', $today['year'] );
            $query->set( 'monthnum', $today['mon'] );
            $query->set( 'day', $today['mday'] );
        }
        return $query;
    }
    add_filter( 'pre_get_posts', 'wpse54142_filter_pre_get_posts' );
    ?>
    

    или

    
    function wpa54142_feed_filter( $query ) {
        if ( $query->is_home() && $query->is_main_query() ) {
            $query->set( 'order', 'ASC' );
            add_filter( 'posts_where', 'wpa54142_filter_where' );
        }
        return $query;
    }
    add_filter( 'pre_get_posts', 'wpa54142_feed_filter' );
    
    function wpa54142_filter_where( $where = '' ) {
        $today = date( 'Y-m-d' );
        $where .= " AND post_date >= '$today'";
        return $where;
    }
    

    К сожалению — не работает. Может и рабочие функции, но у меня не работает — просто вообще ноль реакции.

    Спасибо за уделенное время! Но не помогло.

    вообще никакого результата?
    так может вы не на главной смотрите или это не основой цикл ($query->is_main_query())

    вот попробовал на локальном сервере код:

    
    function textdomain_posts_by_date( $query ) {
        if ( !is_admin() && $query->is_main_query() ) {
            $query->set( 'year', '2016' );
        }
    }
    add_action( 'pre_get_posts', 'textdomain_posts_by_date' );
    

    теперь на главной наблюдаю лишь одну запись, датированную этим годом.

    Да я пробовал и так и этак is_home() менял на категории, архивы, метки и т.д.
    Вот функция с 2016 ближе к делу, но как туда сравнение (больше или равно) запихнуть текущей даты и даты поста? Вот в чём вопрос.

    Попробовал так:

    // Создадим новую функцию которая добавит условие where в запрос
    function filter_where( $where = '' ) {
    	if ($query->is_archive() && $query->is_main_query())
    $current_date = date('Y-m-d');	
    $where .= " AND post_date >= .$current_date";
    	return $where;
    }
    
    add_filter( 'pre_get_posts', 'posts_where', 'filter_where' );
    $query = new WP_Query( $query_string );
    remove_filter( 'pre_get_posts', 'posts_where', 'filter_where' );

    Не вышло.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    • Конечно, вы ведь пишете условие для основного цикла, а потом зачем-то создаёте дополнительный.
    • В блоке if не хватает фигурных скобок, без них к условию относится только одна из двух последующих строк.
    • Зачем точка перед $current_date? Там нужны одинарные кавычки, т.к. идёт сравнение со строкой.
    • Вызов add_filter() некорректен, почему там указаны две функции?

    Этот фрагмент должен быть в файле functions.php активной темы (а не в шаблоне, например, т.к. там переопределять основной запрос уже поздно):

    
    // Создадим новую функцию, которая добавит условие where в запрос
    function filter_where( $where = '' ) {
    	if ( $query->is_archive() && $query->is_main_query() ) {
    		$current_date = date( 'Y-m-d' );	
    		$where .= " AND post_date >= '$current_date'";
    	}
    	return $where;
    }
    add_filter( 'pre_get_posts', 'filter_where' );
    

    А этого вообще быть не должно:

    
    $query = new WP_Query( $query_string );
    remove_filter( 'pre_get_posts', 'posts_where', 'filter_where' );
    

    Не помогло((( Сайт сразу в 500 ошибку вылетает. Блин, может вообще это не возможно сделать? Уже, наверное, сто функций перебрал и всё перерыл.

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Тема «Как в WordPress отфильтровать записи в основном цикле по дате?» закрыта для новых ответов.