带有 ACF 日期字段的 WordPress 自定义帖子类型日历
Posted
技术标签:
【中文标题】带有 ACF 日期字段的 WordPress 自定义帖子类型日历【英文标题】:WordPress Custom Post Type Calendar with ACF Date Fields 【发布时间】:2018-10-02 22:24:54 【问题描述】:由于 WordPress 内置日历不支持自定义帖子类型,使用第三方版本https://wordpress.org/plugins/cpt-calender-widget/。它根据发布日期而不是使用具有高级自定义字段 (ACF) 的日期选择器设置的开始和结束日期来提取日期。
尝试更新插件代码 https://pastebin.com/0URjDg5Q 以改为从 ACF 日期字段中提取。
假设相关代码如下(但请随意查看 pastebin 以获取完整代码):
// Get days with posts
$dayswithposts = $wpdb->get_results( "SELECT DISTINCT DAYOFMONTH( post_date )
FROM $wpdb->posts WHERE MONTH( post_date ) = '$thismonth'
AND YEAR( post_date ) = '$thisyear'
AND post_type IN ( $post_types ) AND post_status = 'publish'
AND post_date < '" . current_time( 'mysql' ) . '\'', ARRAY_N );
if ( $dayswithposts )
foreach ( (array) $dayswithposts as $daywith )
$daywithpost[] = $daywith[0];
else
$daywithpost = array();
并使用它来根据 ACF 日期字段获取即将发生的事件:
<?php
// Upcoming Events & Events Underday
$now = date('Y-m-d H:i:s');
$args = array(
'post_type' => 'events_post_type',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'OR',
'date_upcoming_clause' => array(
'key' => 'event_start_date',
'compare' => '>=',
'value' => $now,
'type' => 'DATETIME'
),
array(
'relation' => 'AND',
'date_started_clause' => array(
'key' => 'event_start_date',
'compare' => '<=',
'value' => $now,
'type' => 'DATETIME'
),
'date_end_clause' => array(
'key' => 'event_end_date',
'compare' => '>=',
'value' => $now,
'type' => 'DATETIME'
),
),
),
'orderby' => array(
'date_started_clause' => 'ASC',
'date_end_clause' => 'ASC',
'date_upcoming_clause' => 'ASC',
),
);
$the_query = new WP_Query($args);
?>
有没有一种简单的方法让插件代码利用相关的 ACF 代码? ACF 非常符合逻辑,但对直接调用数据库的日历插件方法不熟悉。需要注意的是,这个用法是寻找相对相同但不相信找到答案:WORDPRESS: Calendar with custom post type + custom fields。需要注意的是,如果有一种更简单的方法可以使用本机 get_calendar 来执行此操作。
【问题讨论】:
令人不安的是,您在没有任何解释的情况下被否决了。投赞成票。我还在寻找一个日历来显示基于与发布日期无关的 ACF 日期的 CPT。我希望你找到了解决方案。 【参考方案1】:我所做的是修改自定义帖子类型以发布,即使它只是预定的,然后使用发布日期作为事件日期。
/* set to publish even if scheduled and show future date */
remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'futurenow_do_not_set_posts_to_future' );
function futurenow_do_not_set_posts_to_future( $data )
if( ! is_singular( array('events') ) )
if ( $data['post_status'] == 'future' && $data['post_type'] == 'events' )
$data['post_status'] = 'publish';
return $data;
【讨论】:
【参考方案2】:我不知道你为什么使用这些date_upcoming_clause,date_start_clause,'date_end_clause
字段只是使用
直接自定义字段(meta_key
和 meta_value
),如 event_start_date
和 event_end_date
并加入 postmeta
table to posts table 你会得到你想要的确切结果。
`"SELECT * "
. "FROM $wpdb->posts wpposts";
$sql1 .= "JOIN $wpdb->postmeta pm ON (wpposts.ID = pm.post_id)
WHERE post_type = 'your_custom_post_type' AND post_status = 'publish'
AND pm.meta_key = 'event_start_date'
AND pm.meta_value = 20180423
OR pm.meta_key ='event_end_date'
AND pm.meta_value=20180425
";`
【讨论】:
date_end_clause 是 ACF 创建的建议,它在我的 category.php 文件中没有问题,所以都设置在那里。只是希望确定插件中要更改的内容(上面的第一块代码)。您的 sn-p 看起来在正确的轨道上,但是我看到两个硬编码的日期并且不包括 $thismonth 或 $thisyear 变量,所以除非我遗漏了什么,否则假设不起作用?感谢您迄今为止的帮助!以上是关于带有 ACF 日期字段的 WordPress 自定义帖子类型日历的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress rest API:如何附加 Post 对象的所有 ACF?