Связать пользовательский тип записи с членством пользователей

Вопрос или проблема

Я создаю сайт медицинской лаборатории, мне хотелось бы связать пользовательский тип записи – результаты с пользователями. Как я могу связать результаты 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 или специализированные форумы.

Оцените материал
Добавить комментарий

Капча загружается...