Intereting Posts
Пользовательское имя типа сообщения и назначение пользовательской таксономии Рабочий процесс: разработка на локальном ПК и нажатие на Remote Server vs. Как я могу ограничить количество комментариев на зарегистрированного пользователя в день? Разделяйте пользователей на нескольких сайтах в одной базе данных, но с разными доменами cmb2: Мне нужно сохранить значение поля за пределами текущего сообщения. Есть ли крючок, который я могу использовать? URL-адрес URL-адреса для домена для перевода Настройка контекстной справки для каждой страницы Создание резервной копии таблицы Изменить тему на страницу или сообщение Как добавить поддержку темы? Толкот никогда не называется (странное поведение) У моего веб-сайта есть некоторые ошибки сканирования? Параметры видимости WordPress для Frontend Обрезка изображений WordPress (мобильное устройство) Пользовательские поля как параметры типа публикации

WP Query 'posts_per_page'

У меня есть специализированные Clinics и Doctors . У каждой клиники есть собственный clinic_id (через настраиваемые поля). У каждого врача такая же полевая clinic_id с количеством клиник, где он работает.

Мне нужно на single-clinic.php чтобы показать всех врачей, работающих здесь (сравните clinic_id врача с clinic_id текущей страницы).

Для этого я создаю новый объект WP_Query со списком всех врачей, а затем, если клиника_id (на странице клиники) == clinic_id (на странице врачей), отобразите их.

Дело в том, что есть много врачей (более 5 тыс. Страниц), поэтому, когда я пытаюсь установить 'posts_per_page' => -1 он не работает.

 $args = array( 'posts_per_page' => -1, 'post_type' => 'doctors', 'orderby' => "ID", 'nopaging' => true ); $listDoctors = new WP_Query($args); 

Вы знаете, как это сделать?

Вы добавляете необходимые параметры, чтобы запрашивать только сообщения с соответствующим идентификатором клиники.

например

 $q = new WP_Query( [ 'post_type' => 'doctors', 'meta_key' => 'clinic_id', 'meta_value' => get_queried_object_id(), ] ); 

Однако у вас есть фундаментальная ошибка в том, как проектируется структура данных. Фильтруемые поля должны храниться как термины / таксономии, а не мета-сообщения.

Post meta создается быстро, когда вы уже знаете идентификатор сообщения, но здесь вы не знаете идентификатор, вот что вы запрашиваете. Это делает этот запрос чрезвычайно дорогостоящим и медленным . Сервер будет бороться при умеренной или даже легкой нагрузке без большой системы кеширования и будет иметь фундаментальные проблемы, если вы достигнете тысяч сообщений (всех типов, а не только врачей), возможно, больше.

Вместо этого используйте таксономию для хранения идентификаторов клиники, где термин slug – это идентификатор. Не используйте post meta для этого.

Вот код, который автоматически создаст термин, когда создается клиника:

 add_action( 'save_post', function ( $post_id, $post ) { $post_type = get_post_type( $post_id ); // If this isn't a 'clinic' post, skip if ( 'clinic' != $post_type ) { return; } wp_insert_term( $post->post_title, 'clinics', [ 'slug' => $post_id ]); } ); 

Это удалит термин, когда клиника будет удалена:

 add_action( 'before_delete_post', function ( $post_id ) { $post_type = get_post_type( $post_id ); // If this isn't a 'clinic' post, skip if ( 'clinic' != $post_type ) { return; } $term = get_term_by( 'slug', strval( $post_id ) ,'clinics' ); if ( false !== $term ) { wp_delete_term( $term_id, 'clinics' ); } } ); 

Эта функция преобразует сообщение из почтового мета в таксономию:

 function wpse276842_convert_clinic_meta_to_terms( $post_id ) { $clinic_ids = get_post_meta( $post_id, 'clinic_id', false ); if ( empty( $clinic_ids ) ) { return; // none were found! } $slugs = []; foreach ( $clinic_ids as $id ) { $slugs[] = strval( $id ); } wp_set_object_terms( $post_id, $slugs, 'clinics', true ); } 

Если вы хотите получить в каких клиниках, появится пост / врач:

 $terms = wp_get_object_terms( $post_id, 'clinics' ); foreach( $terms as $term ) { echo '<p>'.$term->name.'</p>'; echo get_term_link( $term, 'clinics' ); $clinic = get_post( $term->slug ); // gets the original clinic post } 

Если вы хотите получить всех врачей, принадлежащих к определенной клинике

 $term_id = ... the post ID of the clinic...; $q = new WP_Query([ 'post_type' => 'doctors', 'clinics' => strval( $term_id ), ]); 

Вы пытаетесь запросить 5000 сообщений сразу, когда вам нужна только часть. Вероятно, ваш сервер задыхается от запроса. Даже если бы это сработало, это было бы ужасно неэффективно. Используйте запрос WP Query для запроса только сообщений, которые вам нужны.

 $args = array( 'posts_per_page' => -1, 'post_type' => 'doctors', 'orderby' => 'ID', 'nopaging' => true, 'meta_key' => 'clinic_id', 'meta_value' => get_queried_object_id(), ); $listDoctors = new WP_Query($args); 

Обратите внимание, что этот код предполагает, что clinic_id является правильной мета-ключю для вашего поля, и этот идентификатор соответствует идентификатору текущей страницы клиники.