Расширение Wordpress до предела благодаря расширенной фильтрации мета-запросов - PullRequest
0 голосов
/ 21 января 2020

Вот ситуация, мы создали довольно сложный сайт Wordpress, в результате чего у нас есть пользователи, которые регистрируются и входят в систему для доступа к страницам на сайте, со страницами и активами в нескольких типах записей, все с назначенными им таксономиями и настраиваемыми метаполями. чтобы определить, должен ли пользователь иметь доступ к странице / активу.

Вот моя текущая настройка, которая работает:

Пользовательский тип сообщения Компания

Пользователям назначается объект Компания через Поле расширенных настраиваемых полей .

Каждая Компания имеет одну таксономию « Напишите ему «».

Каждая страница и другие пользовательские записи, используемые на сайте, также имеют эту таксономию, которая используется для фильтрации того, какие типы компаний должны видеть, какой контент при просмотре сайта.

Для одного типа поста мы используем этот таксономический фильтр (tax_query), а также мета-запрос, так как мы также можем выбрать определенные c компаний из типа поста Company, чтобы иметь возможность ее определенные посты. В настоящее время это работает с функцией ниже, которая используется для фильтрации запроса результатов поиска (в качестве примера):

/* Filter the search results by company type */
function filter_search_results($query){
    if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_search()) {
            $filter = array();
            $companytype = get_current_user_companytype(); // custom function to grab type taxonomy from current users company
            $vfuser = get_user_details(); // custom function to get current users details
            $companyid = intval($vfuser['companyid']); // get the users company id
            if ($companyid){
                $filter[] = array('taxonomy' => 'companytype', 'field' => 'name', 'terms' => $companytype);
            }
            $tax_query = array('relation' => 'AND', $filter);
            $query->set( 'tax_query', $tax_query );
            $meta_query = array('relation' => 'OR', array(
                'key' => 'company_select',
                'value' => '"' . $companyid . '"',
                'compare' => 'LIKE',
                ),
                array(
                    'relation' => 'OR',
                    array(
                        'key' => 'company_select',
                        'compare' => 'NOT EXISTS'
                    ),
                    array(
                        'key'     => 'company_select',
                        'value'   => false,
                        'compare' => '='
                    )
            ) );
            $query->set( 'meta_query', $meta_query );
            $query->set( 'posts_per_page', 24 );
        }
    }
}
add_action( 'pre_get_posts', 'filter_search_results' );

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

У меня создано собственное мета-поле сообщения и форма, в которой есть все пользователи на сайте перечислены, и это работает и отправляет массив идентификаторов пользователей в поле, которое можно проверить для каждого сообщения, но мета-запрос становится настолько сложным, что вызывает таймаут 504. Ниже приведен вопрос, который я написал, есть ли у кого-нибудь совет или более простой способ сделать это, пожалуйста, он будет очень признателен.

/* Filter the search results by company type */
function filter_search_results($query){
    if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_search()) {
            $filter = array();
            $companytype = get_current_user_companytype(); // custom function to grab type taxonomy from current users company
            $vfuser = get_user_details(); // custom function to get current users details
            $companyid = intval($vfuser['companyid']); // get the users company id
            if ($companytype){
                $filter[] = array('taxonomy' => 'companytype', 'field' => 'name', 'terms' => $companytype);
            }
            $tax_query = array('relation' => 'AND', $filter);
            $query->set( 'tax_query', $tax_query );
            $meta_query = array('relation' => 'OR', array(
                array(
                    // Users exist
                    'relation' => 'AND',
                    array(
                      'key' => 'comms_users',
                      'compare' => 'EXISTS'
                    ),
                    array(
                        'key' => 'comms_users',
                        'value' => serialize(strval(get_current_user_id())),
                        'compare' => 'LIKE',
                    ),
                ),
                array(
                    // Companies exist but Users do not
                    'relation' => 'AND',
                    array(
                        'relation' => 'OR',
                        array(
                          'key' => 'comms_users',
                          'compare' => 'NOT EXISTS'
                        ),
                        array(
                          'key'     => 'comms_users',
                          'value'   => false,
                          'compare' => '='
                        )
                    ),
                    array(
                        'key' => 'company_select',
                        'value' => '"' . $companyid . '"',
                        'compare' => 'LIKE',
                    ),
                ),
                array(
                    // Company and User select do not exist
                    'relation' => 'AND',
                    array(
                        'relation' => 'OR',
                        array(
                          'key' => 'company_select',
                          'compare' => 'NOT EXISTS'
                        ),
                        array(
                          'key'     => 'company_select',
                          'value'   => false,
                          'compare' => '='
                        )
                    ),
                    array(
                        'relation' => 'OR',
                        array(
                          'key' => 'comms_users',
                          'compare' => 'NOT EXISTS'
                        ),
                        array(
                          'key'     => 'comms_users',
                          'value'   => false,
                          'compare' => '='
                        )
                    )
                )
            ) );
            $query->set( 'meta_query', $meta_query );
            $query->set( 'posts_per_page', 24 );
        }
    }
}
add_action( 'pre_get_posts', 'filter_search_results' );

1 Ответ

0 голосов
/ 06 февраля 2020

На всякий случай, если это пригодится кому-нибудь в будущем (я знаю, что это довольно индивидуальный запрос, но вы никогда не знаете) Мне удалось найти запрос, где решение работает и не слишком интенсивно на сервере.

Окончательный код используется ниже:

/* Filter the search results by partner type */
function filter_search_results($query){
    if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_search()) {
            $filter = array();
            $companytype = get_current_user_ companytype();
            $vfuser = get_user_details();
            $companyid = intval($vfuser['companyid']);
            if ($companytype){
                $filter[] = array('taxonomy' => 'companytype', 'field' => 'name', 'terms' => $companytype);
            }
            $tax_query = array('relation' => 'AND', $filter);
            $query->set( 'tax_query', $tax_query );
            $meta_query = array('relation' => 'OR',
                // Company exists and no users selected
                array(
                    'relation' => 'AND',
                    array(
                        'relation' => 'OR',
                        array(
                            'key' => 'company_select',
                            'value' => '"' . $companyid . '"',
                            'compare' => 'LIKE',
                        ),
                        array(
                            'relation' => 'OR',
                            array(
                                'key' => 'company_select',
                                'compare' => 'NOT EXISTS'
                            ),
                            array(
                                'key'     => 'company_select',
                                'value'   => false,
                                'compare' => '='
                            )
                        )
                    ),
                    array(
                        'relation' => 'OR',
                        array(
                            'key' => 'comms_users',
                            'compare' => 'NOT EXISTS'
                        ),
                        array(
                            'key' => 'comms_users',
                            'value' => false,
                            'compare' => '='
                        )
                    )
                ),
                // Users are selected
                array(
                    'key' => 'comms_users',
                    'value' => serialize(strval(get_current_user_id())),
                    'compare' => 'LIKE'
                )
            );
            $query->set( 'meta_query', $meta_query );
            $query->set( 'posts_per_page', 24 );
        }
    }
}
add_action( 'pre_get_posts', 'filter_search_results' );
...