WordPress

personalizacja — Jak ukryć pole w interfejsie strony Buddypress według identyfikatora pola, zgodnie z rolami użytkownika i statusem logowania?

  • 10 maja, 2024
  • 6 min read
personalizacja — Jak ukryć pole w interfejsie strony Buddypress według identyfikatora pola, zgodnie z rolami użytkownika i statusem logowania?


Nie jestem pewien, czy jest to właściwe miejsce do opublikowania tego, czy też powinienem użyć przepełnienia stosu. Jeśli zajdzie taka potrzeba, mogę umieścić go gdzie indziej.

Nie jestem programistą. Mam bardzo podstawową wiedzę na temat klas CSS (poprzedzonych kropką), identyfikatorów (poprzedzonych symbolem skrótu), php (które muszą być ujęte w pojedyncze cudzysłowy) i HTML. Mogę wkleić CSS i PHP w odpowiednich miejscach w WordPress (CSS: Appearances-> Customize -> przewiń na dół lewej kolumny i dodaj własny CSS. PHP Używam wtyczki Code Snippet lub mogę uzyskać dostęp do panelu sterowania hosta i dodaj go do odpowiedniego pliku PHP, jeśli ktoś mi powie, jak się nazywa i gdzie może się znajdować). Mogę także korzystać z narzędzia „Sprawdź” w przeglądarkach.

Tworzę stronę internetową za pomocą WordPress i Buddypress i będzie ona miała funkcję katalogu członkostwa. Chcę ukryć część profili osób, a mianowicie ich dane kontaktowe, w szczególności numery telefonów i adresy e-mail, aby z oczywistych powodów nie były widoczne dla niezalogowanych widzów, ale także aby tylko użytkownicy z określonymi rolami użytkownika (powiedzmy jako np. „abonent”) może to zobaczyć po zalogowaniu. Chcę też wyświetlić w ich miejscu komunikat wszystkim wylogowanym użytkownikom i wszystkim zalogowanym użytkownikom, którzy nie są użytkownikami z rolą „subskrybenta”, informując ich, że nie mogą tego zobaczyć, chyba że stają się „abonentem”. Żeby było jasne (ponieważ widziałem rozwiązania ograniczające możliwość przeglądania i edytowania tych pól przez użytkowników): chcę ukryć wszystko, co członek witryny umieści w tych polach, aby niezalogowany gość nie mógł tego zobaczyć, a nie ograniczać aby członek witryny nie widział tego pola podczas logowania i chce edytować swój profil. Na przykład, jeśli użytkownik witryny umieści w swoim profilu w polu numeru telefonu „1234”, osoba odwiedzająca tę stronę profilu nie powinna widzieć „1234” (najlepiej byłoby, gdyby zobaczył komunikat z informacją „zaloguj się” lub „zarejestruj się”) jako „subskrybent”, aby zobaczyć swój numer telefonu” (lub cokolwiek innego, do czego służy to pole). Jedynym sposobem, aby mogli go zobaczyć, jest stanie się członkiem witryny z rolą użytkownika „subskrybent”.

Warto przeczytać!  Zmień domyślny szablon w edytorze bloków (Gutenberg)

Użyłem Bing AI Chat, aby uzyskać szablon wtyczki, który ma osiągnąć część, w której pola zawierające dane kontaktowe są ukryte dla niezalogowanych użytkowników. Otworzyłem stronę zawierającą pole, które chcę ukryć dla gości po wylogowaniu, kliknąłem prawym przyciskiem myszy pole w interfejsie, wybrałem „Sprawdź” i wziąłem z niego numer pola, było to w postaci „pole_22” lub jakiejkolwiek innej numer pola. Następnie wkleiłem kod PHP do wtyczki Code Snippet, dodałem numery pól, które chciałem ukryć, oraz role użytkowników, na które chcę zezwolić („abonent” i „administrator”), i aktywowałem to.

Oto oryginalny kod z Bing AI Chat:

<?php
/**
 * Plugin Name: Custom Profile Fields Visibility
 * Description: Hide specific profile fields for logged-out users and show them for specific user roles.
 * Version: 1.0
 * Author: Your Name
 */

// Hook into the profile field visibility logic
add_filter('bp_xprofile_get_hidden_fields_for_user', 'custom_hide_profile_fields', 10, 2);

function custom_hide_profile_fields($hidden_fields, $user_id) {
    // Define the field IDs you want to hide
    $fields_to_hide = array(
        // Add field IDs here (e.g., 'field_1', 'field_2')
        // You can find the field IDs in the BuddyPress admin area
    );

    // Check if the user is logged in
    if (is_user_logged_in()) {
        // Get the user's role(s)
        $user_roles = wp_get_current_user()->roles;

        // Define the allowed user roles (customize as needed)
        $allowed_roles = array('subscriber', 'contributor'); // Example roles

        // Check if the user has an allowed role
        foreach ($user_roles as $role) {
            if (in_array($role, $allowed_roles)) {
                // Show the hidden fields for allowed roles
                return array_diff($hidden_fields, $fields_to_hide);
            }
        }
    }

    // Hide the fields for logged-out users and other roles
    return array_merge($hidden_fields, $fields_to_hide);
}

Oto kod po umieszczeniu w nim numerów pól: Uwaga: jak mówiłem, nie jestem programistą i nie wiem, czy umieściłem je w odpowiednich miejscach i czy w ogóle jest to wpisane w odpowiednim formacie. Pola, które próbowałem ukryć, to pole_22 i pole_23.

<?php
/**
 * Plugin Name: Custom Profile Fields Visibility
 * Description: Hide specific profile fields for logged-out users and show them for specific user roles.
 * Version: 1.0
 * Author: Your Name
 */

// Hook into the profile field visibility logic
add_filter('bp_xprofile_get_hidden_fields_for_user', 'custom_hide_profile_fields', 22,23);

function custom_hide_profile_fields($hidden_fields, $user_id) {
    // Define the field IDs you want to hide
    $fields_to_hide = array('field_22', 'field_23'
        // Add field IDs here (e.g., 'field_22', 'field_23')
        // You can find the field IDs in the BuddyPress admin area
    );

    // Check if the user is logged in
    if (is_user_logged_in()) {
        // Get the user's role(s)
        $user_roles = wp_get_current_user()->roles;

        // Define the allowed user roles (customize as needed)
        $allowed_roles = array('subscriber', 'administrator'); // Example roles

        // Check if the user has an allowed role
        foreach ($user_roles as $role) {
            if (in_array($role, $allowed_roles)) {
                // Show the hidden fields for allowed roles
                return array_diff($hidden_fields, $fields_to_hide);
            }
        }
    }

    // Hide the fields for logged-out users and other roles
    return array_merge($hidden_fields, $fields_to_hide);
}

Moje pytanie/problem:

Warto przeczytać!  Jak dodać atrybut tytułu w menu nawigacji WordPress

Kiedy uruchamiam ten kod, wszystkie pola na stronie profilu znikają, gdy są one przeglądane po wylogowaniu lub zalogowaniu się jako niedozwolona rola użytkownika, a nie tylko określone przeze mnie pole. Jeśli zalogujesz się jako dozwolona rola, wszystko będzie widoczne.

  1. Co mogę zrobić żeby tak było tylko określone pola (tzn. pole_22 i pole_23) są ukryte po wylogowaniu się lub zalogowaniu jako niedozwolona rola, a nie cały profil? Pamiętaj, że profile Buddypress nie są stronami WordPress, więc nie mogę ich otwierać, edytować i umieszczać na nich krótkiego kodu.

  2. W pierwszej linijce rzeczywistego kodu (nie komentarzy), zaraz po komentarzu „// Podłącz logikę widoczności pola profilu”, na końcu widać, że zmieniłem liczby 10 i 2 na 22 i 23, ponieważ Pomyślałem, że muszę tam umieścić numery pól. Nie jestem pewien, czy to robi różnicę. Przetestowałem to również z 10 i 2 i nie było różnicy, wszystko lub nic było ukryte w zależności od logowania i statusu roli użytkownika. Zauważyłem jednak, że jeśli całkowicie usunę te dwie liczby, niezależnie od tego, jakie to są liczby, z początku tej strony, pojawi się na stronie powiadomienie o „błądzie krytycznym”. Reszta serwisu jest w porządku.

  3. Jeśli uda mi się rozwiązać problem nieprawidłowego ukrywania pól, moje następne pytanie brzmi: jak dodać wiadomość zamiast ukrytych pól, informującą użytkownika, aby się zalogował lub zarejestrował jako dozwolona rola użytkownika?

Warto przeczytać!  datepicker — Zmień typ selektora dat (Faktury podzielone)

Dziękuję bardzo.


Źródło