• 05-07-2024, 11:25:00
    #1
    Merhaba,

    WordPress sitemde kullanıcı rollerine göre içerik erişimini kısıtlamaya çalışıyorum ama bir türlü istediğim gibi çalışmıyor. Yazı içeriğini göremiyorlar ama blog sayfasında paylaşılmış olarak görebiliyorlar, kullanıcılarının rolünün olmadığı yazıları görmelerini istemiyorum.

    Tema ve Eklentiler:

    Tema: Avada
    Eklentiler: Members
    Veritabanı Yapısı:

    Gönderilere _members_access_role meta anahtarıyla roller atanıyor (wpfr_postmeta tablosunda).
    Kullanıcılara wpfr_capabilities meta anahtarıyla roller atanıyor (wpfr_usermeta tablosunda).
    Denenen Kodlar:
    Pre_get_posts Hook:

    function restrict_posts_by_user_role($query) {
    if (!current_user_can('manage_options') && $query->is_main_query() && !is_admin()) {
    $user_id = get_current_user_id();
    $user_capabilities = get_user_meta($user_id, 'wpfr_capabilities', true);
    $user_roles = array_keys((array)$user_capabilities);

    if (!empty($user_roles)) {
    $meta_query = array(
    array(
    'key' => '_members_access_role',
    'value' => $user_roles,
    'compare' => 'IN',
    ),
    );

    if ($query->get('meta_query')) {
    $meta_query = array_merge($query->get('meta_query'), $meta_query);
    }
    $query->set('meta_query', $meta_query);
    error_log('restrict_posts_by_user_role: Meta Query Set: ' . print_r($meta_query, true));
    }

    $query->set('post_type', array('post', 'page'));
    error_log('restrict_posts_by_user_role: Query Args: ' . print_r($query->query_vars, true));
    }
    }
    add_action('pre_get_posts', 'restrict_posts_by_user_role');

    -------------

    add_action('wp', 'manual_meta_query_test');
    function manual_meta_query_test() {
    if (!is_admin() && is_main_query()) {
    $user_id = get_current_user_id();
    $user_capabilities = get_user_meta($user_id, 'wpfr_capabilities', true);
    $user_roles = array_keys((array)$user_capabilities);

    if (!empty($user_roles)) {
    $args = array(
    'post_type' => 'post',
    'meta_query' => array(
    array(
    'key' => '_members_access_role',
    'value' => $user_roles,
    'compare' => 'IN',
    ),
    ),
    );

    $test_query = new WP_Query($args);
    error_log('manual_meta_query_test: Query Args: ' . print_r($test_query->query_vars, true));
    error_log('manual_meta_query_test: Found Posts: ' . $test_query->found_posts);

    if ($test_query->have_posts()) {
    while ($test_query->have_posts()) {
    $test_query->the_post();
    error_log('manual_meta_query_test: Post ID: ' . get_the_ID());
    }
    wp_reset_postdata();
    } else {
    error_log('manual_meta_query_test: No posts found');
    }
    }
    }
    }

    Karşılaşılan Sorunlar:
    404 Hataları: Başlangıçta pre_get_posts hookunu uyguladığımda 404 hatası aldım.
    Gönderi Bulunamıyor: Meta sorgusu, veritabanında _members_access_role meta anahtarı doğru atanmış olmasına rağmen herhangi bir gönderi döndürmüyor. Döndürdüğünde bile kod amacına uygun olarak gönderileri gizlemiyor.
  • 05-07-2024, 11:35:12
    #2
    Kurumsal Üye
    function exclude_posts_by_user_role($query) {
    if (!is_admin() && $query->is_main_query() && (is_home() || is_archive())) {
    $excluded_posts = array();

    if (current_user_can('subscriber')) {
    $excluded_posts = array(1, 2, 3);
    }
    if (current_user_can('contributor')) {
    $excluded_posts = array_merge($excluded_posts, array(4, 5, 6));
    }


    $query->set('post__not_in', $excluded_posts);
    }
    }
    add_action('pre_get_posts', 'exclude_posts_by_user_role');


    blogların listelendiği sayfa için bu kodları incele mantığını kavrarsın. Bunu function php ye ekleyebilirsin.



    $excluded_posts = array();

    if (current_user_can('subscriber')) {
    $excluded_posts = array(1, 2, 3);
    } elseif (current_user_can('contributor')) {
    $excluded_posts = array(4, 5, 6);
    }

    if (in_array(get_the_ID(), $excluded_posts)) {
    echo '<p>Bu içerik sizin rolünüz için görüntülenemez.</p>';
    } else {
    the_content();
    }



    buda single php için
  • 05-07-2024, 11:52:27
    #3
    Benim ihtiyacım, kullanıcıların sadece kendi rollerine atanmış gönderileri görmelerini sağlamak. Bu kod ise belirli gönderileri hariç tutma mantığına dayanıyor ve sadece belirli gönderileri göstermemek üzerine çalışıyor. Giriş yapan kullanıcının rollerini çekip sitededeki yazılara atanmış roller ile otomatik karşılaştırılma yapılması lazım.
  • 05-07-2024, 13:23:08
    #4
    Eklenti olarak yapabilirsin dışardan yüklersin ücretli olarak yapabilirim istersen