Wordpress: Календарь событий, ACF: Фильтр панели фильтра TEC на основе поля отношений ACF - PullRequest
0 голосов
/ 07 октября 2018

Я немного боролся с этим.У меня есть один пользовательский тип записи, который я создал, под названием «pt_initiatives», и один, который создал Календарь событий, под названием «tribe_events».С помощью расширенных настраиваемых полей я добавил поле отношения к обоим типам записей, которое также является двунаправленным.Поле отношений называется «bi_initiatives-events».

У меня есть календарь событий Pro с добавленной панелью фильтров.Я пытаюсь создать фильтр, который показывает сообщения pt_initiatives в качестве параметров в фильтре с несколькими флажками.(Есть только 9 из этих сообщений).У меня эта часть работает до сих пор.Я немного растерялся, как обновить список событий, когда выбрана одна из этих pt_initiatives.

Я безуспешно играю с запросами wpdb.Я не уверен, как сказать ему, чтобы посмотреть на сообщения Tribe_events, чтобы найти общие сообщения.Я искал в интернете и не нашел ничего слишком полезного, и люди из «Календаря событий», похоже, не слишком хотят помочь, поскольку это считается «кастомизацией».Тем не менее, они предлагают возможность добавлять фильтры как функцию ... У них есть очень расплывчатая страница о том, как это сделать, но я лично не нашел это слишком полезным.

Я не слишком знаком с написанием wpdbзапросы, следовательно, вы можете увидеть, как я добавляю цикл сообщений для достижения того же.По крайней мере, я думаю, что это тот же вывод, что и некоторые примеры, с которыми я сталкивался.

Заранее спасибо!

   class Tribe__Events__Filterbar__Filters__Initiative extends Tribe__Events__Filterbar__Filter {
    public $type = 'checkbox';

    public function get_admin_form() {
        $title = $this->get_title_field();
        $type = $this->get_multichoice_type_field();
        return $title.$type;
    }

    protected function get_values() {
        /** @var wpdb $wpdb */
        global $wpdb;

        // get initiative IDs associated with published posts
        // $initiative_ids = $wpdb->get_col( 
        //     $wpdb->prepare( 
        //         "SELECT DISTINCT m.meta_value 
        //         FROM {$wpdb->postmeta} m 
        //         INNER JOIN {$wpdb->posts} p 
        //         ON p.ID=m.post_id 
        //         WHERE p.post_type=%s,
        //         AND p.post_status='publish' 
        //         AND m.meta_key='bi_initiatives-events' 
        //         AND m.meta_value > 0", $post_type
        //     ) 
        // );


        $initiative_ids = array();
        // WP_Query arguments
        $args = array(
            'post_type' => array( 'pt_initiatives' ),
            'posts_per_page' => -1,
            'meta_query' => array(
                array(
                    'key' => 'bi_initiatives-events',
                    // 'value' => '',
                    'compare' => 'EXISTS'
                )
            )
        );

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post();

                $initiative_ids[] = get_the_ID();
            }
        } 
        wp_reset_postdata();

        array_filter( $initiative_ids );
        if ( empty( $initiative_ids ) ) {
            return array();
        }

        /**
         * Filter Total Initiatives in Filter Bar
         * Use this with caution, this will load initiatives on the front-end, may be slow
         * The base limit is 200 for safety reasons
         *
         *
         * @parm int  200 posts per page limit
         * @parm array $initiative_ids   ids of initiatives attached to events
         */
        $limit = apply_filters( 'tribe_events_filter_bar_pt_initiatives_limit', 200, $initiative_ids );

        $initiatives = get_posts( array(
            'post_type' => 'pt_initiatives',
            'posts_per_page' => $limit,
            'suppress_filters' => false,
            'post__in' => $initiative_ids,
            'post_status' => 'publish',
            'orderby' => 'title',
            'order' => 'ASC',
        ) );

        $initiatives_array = array();
        foreach ( $initiatives as $initiative => $value ) {
            $initiatives_array[] = array(
                'name' => $value->post_title,
                'value' => $value->ID,
            );
        }
        return $initiatives_array;
    }

    protected function setup_join_clause() {
        add_filter( 'posts_join', array( 'Tribe__Events__Query', 'posts_join' ), 10, 2 );
        global $wpdb;

        $this->joinClause .= " LEFT JOIN {$wpdb->postmeta} AS initiatives_filter ON ({$wpdb->posts}.ID = initiatives_filter.post_id AND initiatives_filter.meta_key = 'bi_initiatives-events')";
    }

    protected function setup_where_clause() {
        if ( is_array( $this->currentValue ) ) {
            $initiative_ids = implode( ',', array_map( 'intval', $this->currentValue ) );
        } else {
            $initiative_ids = esc_attr( $this->currentValue );
        }

        $this->whereClause = " AND initiatives_filter.meta_value IN ($initiative_ids) ";

    }
}
new Tribe__Events__Filterbar__Filters__Initiative( __( 'Initiatives', 'tribe-events-filter-view' ), 'initiatives_filter' );
...