带有 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_keymeta_value),如 event_start_dateevent_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:带有过滤器的存档页面不起作用(ACF)

Wordpress rest API:如何附加 Post 对象的所有 ACF?

如何在 ACF 日期选择器中限制 Wordpress 中的开始日期和结束日期的两个日期?

在wordpress中匹配搜索结果后识别ACF字段

无法解析 acf 字段中的简码(wordpress)

ACF 关系字段的 WordPress 查询