Вопрос или проблема
Я создаю сайт медицинской лаборатории, мне хотелось бы связать пользовательский тип записи – результаты с пользователями. Как я могу связать результаты CPT с пользователем?
Идея заключается в том, чтобы иметь возможность ассоциировать несколько результатов тестов с одним пользователем/участником. В настоящее время я использую членство WooCommerce для управления членством.
Пожалуйста, любые идеи или просто укажите мне правильное направление будут полезны. Заранее спасибо!
Если я правильно понимаю, что вы ищете, вы можете создать простую функцию, которая будет срабатывать при создании нового CPT и обновлять пост_meta, например: “user_controler” для этого.
Позже вам нужно будет отфильтровать посты на post.php
, чтобы показывать только посты, связанные с текущим пользователем.
add_action("save_post", function ($post_ID, $post){
$post = get_post($post_ID);
$user = get_curent_user();
if($post->post_type === "my_cpt" && !get_post_meta($post_ID, "my_meta_key")){
update_post_meta($post_ID, "my_meta_key", $user->key);
}
//$user->key соответствует тому, что вы хотите сохранить как ссылку.
});
Чтобы отфильтровать посты на странице post.php
, вы можете:
add_filter( 'posts_results', 'my_posts_results_filter' );
function my_posts_results_filter( $posts ) {
global $my_global_condition;
$user = get_curent_user();
$screen = get_current_sreen();
$filtered_posts = array();
foreach ( $posts as $post ) {
if (
$post->post_type === "my_cpt" &&
$screen->ID === $my_cpt &&
get_post_meta($post_ID, "my_meta_key")=== $user->key
) {
// Это разрешено :).
$filtered_posts[] = $post;
}
}
return $filtered_posts;
}
Вы также можете использовать фильтр post_where.
Вы также можете фильтровать посты просто на основе свойства автора.
С 💕.
Ответ или решение
Для связи пользовательских записей (CPT) с членством пользователя на сайте медицинской лаборатории, вам необходимо определить, как правильно ассоциировать результаты тестов с конкретными пользователями, используя WooCommerce Membership. В этом ответе мы рассмотрим, как создать функционал, который позволит связывать результаты с пользователями, а также способ фильтрации их отображения.
1. Создание пользовательского типа записи (CPT)
Сначала убедитесь, что у вас настроен пользовательский тип записи для медицинских результатов. Это можно сделать с помощью функции register_post_type()
в файле functions.php
вашей темы:
function create_test_results_cpt() {
register_post_type('results',
array(
'labels' => array(
'name' => __('Results'),
'singular_name' => __('Result')
),
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'custom-fields')
)
);
}
add_action('init', 'create_test_results_cpt');
2. Связывание записей с пользователями
Вам нужно создать функцию, которая будет срабатывать при сохранении новой записи CPT. Эта функция будет обновлять мета-данные записи, чтобы связать её с текущим пользователем.
add_action("save_post", function ($post_ID, $post) {
if ($post->post_type === "results" && !get_post_meta($post_ID, "associated_user")) {
$current_user = wp_get_current_user();
update_post_meta($post_ID, "associated_user", $current_user->ID);
}
});
Этот код добавляет мета-данные с идентификатором пользователя, который создал запись, к каждой записи результатов.
3. Фильтрация записей для текуще́го пользователя
Для того чтобы отфильтровать записи и отобразить только результаты, связанные с текущим пользователем, добавьте фильтр в ваш шаблон. Вы можете использовать pre_get_posts
, чтобы изменить запрос перед его выполнением:
add_action('pre_get_posts', function ($query) {
if (is_admin() && $query->is_main_query() && $query->get('post_type') === 'results') {
$current_user = get_current_user_id();
if ($current_user) {
$meta_query = array(
array(
'key' => 'associated_user',
'value' => $current_user,
'compare' => '='
)
);
$query->set('meta_query', $meta_query);
}
}
});
Этот код проверяет, является ли запрос основным и предназначенным для админки и типа записи results
, после чего добавляет условие для выбора только тех записей, которые связаны с текущим пользователем.
4. Заключение
Теперь у вас есть основная структура для связывания пользовательских записей результатов с пользователями, а также механизм для их фильтрации в админке. Данный подход обеспечивает поддержание целостности данных и удобство в управлении результатами.
Не забывайте тестировать ваш код на локальном или тестовом сайте, прежде чем внедрять его на боевой. Если у вас возникнут дополнительные вопросы или потребуются уточнения, не стесняйтесь обращаться за помощью в сообщество разработчиков WordPress или специализированные форумы.