带有ACF日期字段的WordPress自定义帖子类型日历

时间:2018-04-22 22:55:48

标签: wordpress advanced-custom-fields

由于WordPress内置日历不支持自定义帖子类型,因此使用第三方版本https://wordpress.org/plugins/cpt-calender-widget/。它根据发布日期而不是使用带有高级自定义字段(ACF)的日期选择器设置的开始和结束日期来提取日期。

尝试更新插件代码https://pastebin.com/0URjDg5Q以取代ACF日期字段。

假设相关代码如下(但可以随意查看pastebin以获取完整代码):

#include <iostream>
#include <vector>
using namespace std;
void Crack(string password, vector<char> Chars)
{
    cout<<"PASSWORD TO CRACK: "<<password<<endl;
    int n = Chars.size();
    int i = 0;
    while(true)
    {
        i++;
        int N = 1;
        for(int j=0;j<i;j++)N*=n;
        for(int j=0;j<N;j++)
        {
            int K = 1;
            string crack = "";
            for(int k=0;k<i;k++)
            {
                crack += Chars[j/K%n];
                K *= n;
            }
            cout<< "Testing PASS: "<<crack<<" "<<"against "<<password<<endl;
            if(password.compare(crack) == 0){
                cout<<"Cracked password: "<<crack<<endl;
                return;
            }
        }
    }
}

int main()
{
    vector<char> Chars;
    for(char c = '0';c<='z';c++){
        if(isalpha(c) || isdigit(c))Chars.push_back(c);
    }
    Crack("zzzzzzzz", Chars);
}

并根据ACF日期字段将其用于获取即将发生的事件:

// 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代码? ACF非常符合逻辑,但不熟悉直接调用数据库的日历插件方法。需要注意的是,这种用法寻找相对相同,但不相信找到答案:WORDPRESS: Calendar with custom post type + custom fields。需要注意的是,如果有更简单的方法可以使用原生的get_calendar打开它。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我不知道你为什么使用这些     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
";`