在我们编写代码和详细说明之前,让我们先看看手头的问题。
首先,任何valid date format 在中有效custom field 如果您不打算使用它进行比较和排序
当您要在自定义字段中按日期排序或按日期进行比较时,应忽略要点一。有only two 如果要按自定义字段日期排序,则可以使用可行的格式。它们是:
Unix时间戳(我个人认为这是一个整数值,对应于自1970年1月1日以来经过的秒数)。在我看来,以这种格式保存日期是最准确的,任何时间戳都可以使用DateTime
class. 请注意,目前只支持1970年1月1日至2038年1月19日之间的日期
Y-m-d H:i:s
或Y-m-d
或H:i:s
. 任何其他格式都不起作用。这个orderby
参数按字面顺序排序,因此基本上,根据order
参数,如果它们匹配,则比较第二个数字等,直到找到不匹配的数字并返回排序顺序。建议设置正确的type
中的参数值meta_query
根据您的具体格式。这些type
参数值为DATE
, DATETIME
和TIME
在查询此特定字段时,它将处理您的确切格式上述内容非常重要,因此在继续之前,请确保您理解了该部分内容,并且您的值格式正确,否则下一节将不起作用
现在格式已经排序,我们需要用简单的英语写下我们需要的内容。如果事情变得棘手或太复杂,我倾向于使用这种方法。这确实很有帮助。所以,简单地说,这就是您的查询应该做的
应显示所有带有缩略图的帖子。此选项另存为自定义字段,_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:s
和
Y-m-d
. 我必须修复一到两个小bug。希望有帮助