Wordpress ACF: сложный поиск занимает слишком много времени - PullRequest
0 голосов
/ 25 октября 2018

На веб-сайте WordPress, который я создаю, у меня есть пользовательский пост (cp_course), который имеет следующие подполя: course_code, course_duration, period_a_start, period_a_end, period_b_start, period_b_end, period_c_start, period_c_end, period_d_start и period_d_end.

Форма поиска имеет следующие поля: code, duration, datefrom, dateto.Пользователь может искать с помощью любого из них.Я реализовал только случай, когда пользователь использует все поля поиска:

if(!empty($code) && !empty($duration) && !empty($datefrom) && !empty($dateto))
{

    $args = array(
        'post_type'  => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
        'meta_query' => 
            array(
                'relation' => 'AND',
                array(
                    'key'   => 'course_code',
                    'value' => $code,
                ),
                array(
                    'key' => 'course_duration',
                    'value' => $duration,
                ), 
                array(
                    'relation' => 'OR',
                    array(
                        'relation' => 'AND',
                        array(
                            'key'   => 'period_a_start',
                            'compare' => '>=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($datefrom)),

                        ),
                        array(
                            'key'   => 'period_a_end',
                            'compare' => '<=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($dateto)),

                        ),
                    ),
                    array(
                        'relation' => 'AND',
                        array(
                            'key'   => 'period_b_start',
                            'compare' => '>=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($datefrom)),

                        ),
                        array(
                            'key'   => 'period_b_end',
                            'compare' => '<=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($dateto)),

                        ),
                    ),//IF I REMOVE the follow lines (period_c_* and period_d_*) then it works
                    array(
                        'relation' => 'AND',
                        array(
                            'key'   => 'period_c_start',
                            'compare' => '>=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($datefrom)),

                        ),
                        array(
                            'key'   => 'period_c_end',
                            'compare' => '<=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($dateto)),

                        ),
                    ),
                    array(
                        'relation' => 'AND',
                        array(
                            'key'   => 'period_d_start',
                            'compare' => '>=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($datefrom)),

                        ),
                        array(
                            'key'   => 'period_d_end',
                            'compare' => '<=',
                            'type' => 'numeric',
                            'value' => date("Ymd", strtotime($dateto)),

                        ),
                    ),
                ),
            )

    );

    $course = get_posts($args);

}

<div class="page_title">
                    <h3>Courses</h3>
                </div>

                <?php foreach ($course as $post):setup_postdata($post);?>
                <a href="#"><?php the_title();?></a>

                <?php endforeach;wp_reset_postdata();?>

Но это не похоже на работу.Он застрял в петле, уже 10 минут и все еще в поиске.Что идет не так?

Существует ли более простая логика для реализации различных случаев, чем несколько ifs?Я собираюсь использовать что-то вроде этого, но это выглядит очень долго и сложно ...:

if(!empty($code) && !empty($duration) && !empty($datefrom) && !empty($dateto))
{....}
else if(empty($code) && !empty($duration) && !empty($datefrom) && !empty($dateto))
{....}
.......

1 Ответ

0 голосов
/ 25 октября 2018

Интересный вопрос, однажды у меня была такая же проблема с ACF.

Выполнение всех этих операций if заняло бы много времени и не очень эффективно, я говорю, что вы пытаетесь использовать следующий метод:

Попробуйте создать эти массивы мета-запросов самостоятельно, прежде чем запускать get_posts и инициировать $args и назначить его соответствующим образом, например:

    if($code || $duration || $datefrom || $dateto){
        $meta_query = array( array( 'relation' => 'AND' ) );

        if ( $code ) {
            array_push( $meta_query, array(
                array(
                    'key'   => 'course_code',
                    'value' => $code,
                )
            ) );
        }

        if($duration){
            array_push( $meta_query, array(
                array(
                    'key' => 'course_duration',
                    'value' => $duration,
                )
            ) );
        }
//And so on
    }

Это определенно будет большесложный для вложенных отношений (например, period_a_start), но это довольно простой и самый простой / эффективный способ сделать это.

Удачи!

...