Pre_Get_POST的排序和限制

时间:2015-06-21 作者:tslid

这是我关于WP查询和pre\\u get\\u帖子的第三个问题(很抱歉),但我不能在成功之前放弃一步:)

因此,我的问题是,将头版帖子限制在只有特色图片的帖子上。到目前为止还不错。我的最后一个目标是按自定义字段对这些帖子进行排序,按ASC顺序对它们进行排序,并仅显示图元键/自定义字段日期在30天内的帖子。到目前为止,这是我的代码和我的尝试,但似乎我还没有接近。。。

当前排序混乱。对于只显示未来30天内帖子的第二部分,我想到的是设置一个保持当前日期+30天的var,一个具有自定义字段日期的var,并且要检查的是第一个大于第二个的var,但是我如何在该函数中获取自定义字段,如果检查,该如何放置?也许这些问题很简单,但我很挣扎。感谢您的时间和知识分享。

add_action( \'pre_get_posts\', function ( $q ) 
{

    if (     $q->is_home() // Target the home page only
          && $q->is_main_query() // Target only the main query
          || $q->is_category()
    ) {
        $meta_query = array(
            array(
                \'key\' => \'_thumbnail_id\',
            )
        );
        $q->set( \'meta_query\', $meta_query );
        $q->set(\'orderby\',\'meta_value_num\');
$q->set(\'meta_key\', \'event_date\');
$q->set(\'order\', \'ASC\');
    }
});

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

在我们编写代码和详细说明之前,让我们先看看手头的问题。

首先,任何valid date format 在中有效custom field 如果您不打算使用它进行比较和排序

当您要在自定义字段中按日期排序或按日期进行比较时,应忽略要点一。有only two 如果要按自定义字段日期排序,则可以使用可行的格式。它们是:

Unix时间戳(我个人认为这是一个整数值,对应于自1970年1月1日以来经过的秒数)。在我看来,以这种格式保存日期是最准确的,任何时间戳都可以使用DateTime class. 请注意,目前只支持1970年1月1日至2038年1月19日之间的日期

  • Y-m-d H:i:sY-m-dH:i:s. 任何其他格式都不起作用。这个orderby 参数按字面顺序排序,因此基本上,根据order 参数,如果它们匹配,则比较第二个数字等,直到找到不匹配的数字并返回排序顺序。建议设置正确的type 中的参数值meta_query 根据您的具体格式。这些type 参数值为DATE, DATETIMETIME 在查询此特定字段时,它将处理您的确切格式

    上述内容非常重要,因此在继续之前,请确保您理解了该部分内容,并且您的值格式正确,否则下一节将不起作用

    现在格式已经排序,我们需要用简单的英语写下我们需要的内容。如果事情变得棘手或太复杂,我倾向于使用这种方法。这确实很有帮助。所以,简单地说,这就是您的查询应该做的

    应显示所有带有缩略图的帖子。此选项另存为自定义字段,_thumbnail_id. 此外,这些职位还应在未来30天内确定日期。这也取决于自定义字段。这些帖子还应根据自定义字段中的日期进行排序

    很好,这意味着meta_query, 我们的帖子应该有缩略图AND这将是自定义字段之间的关系),必须具有自定义字段日期值BETWEEN 当前时间和当前时间后的30天

    让我们把它转换成代码:(注意:注意:这是未经测试的,由于使用了DateInterval. 此外,这是通过Y-m-d H:i:s 自定义字段中的日期格式。保持日期格式的统一,否则它将无法工作

    add_action( \'pre_get_posts\', function( $q )
    {
        if (     $q->is_home() // Target the home page only
              && $q->is_main_query() // Target only the main query
              || $q->is_category() // NO IDEA WHY YOU ADDED THIS! ARE YOU TARGETING CATEGORY PAGES AS WELL?
        ) {
    
            $current_time = new DateTime(); // Get the current date and time
                $current_time_format = $current_time->format( \'Y-m-d H:i:s\' ); // This is the current date and time
    
            $after_thirty_days = new DateTime(); // Create the date after 30 days
                $after_thirty_days->add( new DateInterval( \'P30D\' ) ); // Adds 30 days to the current date and time
                $date_after_thirty_days = $after_thirty_days->format( \'Y-m-d H:i:s\' );
    
            $meta_query = array(
                //Default relation is AND, no need to set it. So posts should match both conditions set in the two sets of arrays
                array( // Our first array of conditions set to get posts with a thumbnail
                    \'key\' => \'_thumbnail_id\'
                ),
                array( // Our second array of conditions. Posts should also have these conditions in addition to the first array of conditions
                    \'key\' => \'event_date\',
                    \'value\' => array( $current_time_format, $date_after_thirty_days ), // Add todays date and date after 30 days as an array
                    \'compare\' => \'BETWEEN\', // Will look for valid values between the array of dates given in the value parameter
                    \'type\' => \'DATETIME\' // We will use the date and time format to compare our dates
                ),
            );
            $q->set( \'meta_query\', $meta_query );
            $q->set( \'orderby\', \'meta_value_num\' );
            $q->set( \'meta_key\', \'event_date\' );
            $q->set( \'order\', \'ASC\' );
        }
    });
    
    最后几点注意事项:正如我之前提到的,这是未经测试的,因此可能无法直接运行。它可能需要一些调整。

    我使用了这种格式Y-m-d H:i:s 在这里你可以使用Y-m-d 这里也是。只需相应地调整查询和日期。如果要使用时间戳,请记住将比较日期转换为时间戳

    由于您使用的是无限滚动,您需要记住相应地调整该功能,否则第2页及以上将显示错误的帖子

  • 编辑

    以上代码现在已经过测试,可以按照预期的日期格式使用Y-m-d H:i:sY-m-d. 我必须修复一到两个小bug。希望有帮助

    结束

    相关推荐

    Sort Posts By Category?

    谷歌搜索了几个小时,找不到解决方案。在我的theme 你有一个Browse 从我正在处理的自定义帖子类型中提取所有视频的页面。如果用户制作了30个类别,那么我希望用户能够使用顶部列出的类别按钮对视频进行排序。如果他们点击Horror 我想循环显示所有Horror 视频。如何在此循环中使用类别对视频进行排序?BROWSE PAGE我的类别ul li a<ul class=\"sort-by-category\"> <? $args = array(&#x