2016-08-25 2 views
0

Контекст: Я создал популярный виджет сообщений, который использует мета-поле в качестве индикатора того, насколько популярна публикация. Этот виджет связан с плагином для обмена социальными сетями, так что, когда они извлекают количество акций для популярных сетей, он сохраняет эти счета в мета-поле. Затем мы можем запросить это мета-поле, чтобы показывать популярные сообщения, исходя из того, сколько раз статья делилась через социальные сети.Почему этот пользовательский цикл WordPress не использует мои аргументы?

Образец кода: Это небольшая выборка кода, который я использую. Очевидно, что после этой части кода мы закрываем цикл while, закрываем условие, перезапускаем данные почтового запроса и т. Д. Полное содержимое этого файла виджетов можно найти здесь: https://github.com/warfare-plugins/social-warfare/blob/master/functions/widgets.php Часть, которую вы видите ниже, начинается с строка 330 этого файла.

// If a custom timeframe is not being used.... 
    if($timeframe == 0): 

     // Create the arguments for a query without a timeframe 
     $swp_args = array(
      'posts_per_page' => $count, 
      'post_type'   => 'post', 
      'meta_key'   => '_'.$network, 
      'orderby'   => 'meta_value_num', 
      'order'    => 'DESC', 
     ); 

    // If a custom timeframe is being used.... 
    else: 

     // Create the arguments for a query with a timeframe 
     $swp_args = array(
      'posts_per_page' => $count, 
      'post_type'   => 'post', 
      'meta_key'   => '_'.$network, 
      'orderby'   => 'meta_value_num', 
      'order'    => 'DESC', 
      'date_query'  => array(
       'column'  => 'post_date', 
       'after'   => '- '.$timeframe.' days' 
      ) 
     ); 
    endif; 

    // Reset the main query 
    wp_reset_postdata(); 

    // Query and fetch the posts 
    $swq = new WP_Query($swp_args); 

    // Begin the loop 
    if($swq->have_posts()) : 
     $i = 1; 
     while($swq->have_posts()): 

      $swq->the_post(); 

Проблема: У нас есть этот плагин на чуть более 5000 сайтов. Однако на небольшом количестве сайтов он НЕ использует наш пользовательский запрос, но вместо этого он использует запрос WordPress по умолчанию. В этих случаях он возвращает самые последние сообщения и возвращает количество сообщений в зависимости от настроек WordPress на странице. Фактически, на одном сайте, например, он отлично работает на одной странице, но на страницах архива/категории он возвращается к использованию цикла по умолчанию WordPress вместо моего пользовательского запроса.

Интересно, является ли их еще один плагин или тема, которая добавила некоторые перехватчики или что-то еще в WordPress-запрос, и это переопределяет мои пользовательские аргументы.

Единственное, что я пробовал до сих пор, это добавить wp_reset_postdata() до и после моего запроса, но, похоже, ничего не исправить.

Вопрос: Есть ли способ запустить этот пользовательский запрос и гарантировать, что он запускает пользовательский запрос и никогда не запускает запрос WordPress по умолчанию?

+0

Позвольте мне ответить на это процитировать то, что я сказал в исходном сообщении: «Очевидно, что после этой части код, мы закрываем цикл while, закрываем условное выражение, перезапускаем данные почтового запроса и т. д. Полное содержимое этого файла виджетов можно найти здесь: GETHUB: https://github.com/warfare-plugins/social-warfare /blob/master/functions/widgets.php " –

ответ

0

В соответствии с Wordpress documentation он выглядит как date_query определяется как version 3.7 в списке параметров даты WP_Query. Возможно, эти подмножества сайтов, на которых этот запрос не работает, не используют Wordpress версии 3.7 или новее.

Единственное, что я могу придумать, где эта ошибка появится иногда, а не в другие времена, будет использовать really old/outdated versions of PHP.

Например, strtotime('- 180 days') произведет противоречивые результаты по версиям PHP < 5.1.2, как вы можете видеть здесь, из this 3v4l.org test. Это очень маловероятно, но поскольку он кажется очень маленьким подмножеством сайтов, где он не работает, и учитывая, что ничего другого, очевидно, не ошибочно с кодом, это было бы моим лучшим просвещенным предположением.

Чтобы получить более последовательное поведение по всем направлениям, вы должны использовать strtotime('-180 days') вместо этого, так изменить свои параметры запроса 'after' => '-'.$timeframe.' days'

+0

Хорошее наблюдение. Однако на одном сайте, где я просто тестировал, я установил $ timeframe как для 0, так и для 180 для двух тестов. Когда установлено значение 0, он будет использовать запрос без параметра date_query. Ничего не сработало. Кроме того, я просто проверил один из сайтов с этой проблемой, и они действительно работают с WP 4.5.x. –

+0

Вы говорите, что этот код не работает вообще ни на одной версии WP, на которую вы его протестировали? Или вы говорите, что это работает иногда, но не в другое время? – Sherif

+0

Этот код находится на 5000+ сайтах. Он работает не только на 2 или 3 из них. –

Смежные вопросы