Zdefiniuj warunkowo WP_DEBUG / tylko dla administratorów / błędy dziennika (dołączyć argument arg dla wszystkich linków?)


20

Tworzę witrynę na serwerze, do której klient ma również dostęp, a to, co chciałbym zrobić, to pokazywanie WP_DEBUGtylko administratorom. Odwoływanie artykuł Yoast jest na odwrót to:

if ( isset($_GET['debug']) && $_GET['debug'] == 'true')
    define('WP_DEBUG', true);

wyświetla się WP_DEBUGtylko w przypadku ?debug=truedołączonych do nich adresów URL , nphttp://domain.com/?debug=true

Myślałem, że pasek debugowania może domyślnie przechowywać niektóre z tych informacji (niezależnie od tego, czy WP_DEBUGjest włączony), ale myślałem o szaleństwie, ponieważ nie sądzę, żeby tak było.

Pomyślałem, że przydałby się bieżący użytkownik (posiadający taką manage_optionsmożliwość, a następnie uruchamiający linki add_query_arg():

function zs_admin_debug() {
    if (!current_user_can('manage_options')) {
        add_query_arg('debug','true');
    }
}

ale nie jestem pewien - czy jest jakiś haczyk, którego mogę użyć do wykonania wszystkich linków na stronie? W ten sposób administratorzy zawsze widzą debugowanie, które moim zdaniem byłoby bardzo przydatne. Dzięki jak zawsze za pomoc!


To obejście (Yoast) jest niezwykle przydatne do debugowania w locie. Włączyłem także rejestrowanie, które działa dobrze. Lekko zmodyfikowałem swój kod: if ( isset( $_GET['bug'] ) ) więc odwiedzam błąd link / ?, aby zobaczyć debugowanie :)
Jarmerson

Odpowiedzi:


18

Nie sądzę, że istnieje uniwersalny hak URL. Jest wiele haczyków i mogłem to przegapić, ale nie sądzę, żeby istniała jedna. Możesz przejrzeć haczyki na adambrown.info . Istnieje wiele haczyków URL, ale nie uniwersalnych.

Jeśli mogę zasugerować inne rozwiązanie: zaloguj błędy do pliku.

/**
 * This will log all errors notices and warnings to a file called debug.log in
 * wp-content (if Apache does not have write permission, you may need to create
 * the file first and set the appropriate permissions (i.e. use 666) ) 
 */
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors',0);

Ten kod pochodzi bezpośrednio z Kodeksu dla pliku wp-config.php . Jeśli to zrobisz, nie będziesz musiał się martwić o żonglerkę $_GETlub ustalenie, kto jest, a kto nie jest administratorem.

Edytować:

Zapomniałem jednego możliwego rozwiązania. Możesz to zrobić za pomocą Javascript. Krótki skrypt może dołączyć parametr do wszystkich adresów URL na stronie, a skrypt można łatwo załadować tylko dla administratorów.

Nadal sugerowałbym rozwiązanie „log”, ponieważ błędy dla wszystkich są rejestrowane. Jeśli twoi ludzie są jak moi i wysyłają „raporty” o błędach, takie jak „ hej, witryna jest zepsuta, kiedy wypełnisz ten formularz ”, docenisz dziennik. :)


Wydaje mi się, że jestem po prostu rozpieszczony widząc je na ekranie :), ale plik dziennika ma tutaj większy sens. Zrobię trochę więcej badań nad moim celem, ale wydaje się, że jest to najlepsze rozwiązanie, jakie do tej pory spotkałem. Dzięki!
Zach.

5
Pamiętaj, że natywne rejestrowanie jest zakodowane na stałe w celu zalogowania do pliku dostępnego w Internecie, co nie jest tak dobrym pomysłem w produkcji. Lepiej jest skonfigurować lokalizację pliku dziennika prywatnego (poza folderem internetowym) za pomocą PHP dla witryn na żywo.
Rarst

9

Mimo że moje pierwsze podejście dotyczyło kosza na śmieci, a odpowiedź s_ha_dums jest czysta i prawdopodobnie najlepsza, można to zrobić, ale proponuję jeszcze jeden scenariusz działania:

Poniżej ustawiono plik cookie, który jest ważny przez następne 24 godziny (86400 sekund), gdy administrator loguje się do systemu. W wp-config.php stała WP_DEBUGjest warunkowo zdefiniowana w zależności od obecności i wartości wspomnianego pliku cookie.

Zastrzeżenie: WP_DEBUGzostanie następnie ustawione na truedla wszystkich logujących się z tej samej przeglądarki na tym samym komputerze tego samego dnia.

w functions.php (lub jako wtyczka):

function wpse_69549_admin_debug( $user_login, $user )
{
    if ( in_array( 'administrator', $user->roles ) ) {
        setcookie( 'wp_debug', 'on', time() + 86400, '/', get_site_option( 'siteurl' ) );
    }
}
add_action( 'wp_login', 'wpse_69549_admin_debug', 10, 2 );

Zobacz: Codex> Action Action> wp_login

w wp-config.php :

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}

Andrew Nacin skomentował ten artykuł, wspominając, że initjest za późno, aby przynieść jakikolwiek efekt. Próbowałem również tego i to nie zadziałało.
Zach

Stałe nie mogą być ponownie zdefiniowane. Można modyfikować poziom zgłaszania błędów bez dotykania stałej, ale nie jest idealny. Przed inittym jest wiele rzeczy, które się interesują.
Rarst

Myślę, że zaakceptowana odpowiedź pozostaje najbardziej realnym rozwiązaniem, jednak ze względu na kompletność to nowe podejście powinno wykonać zadanie z wyświetlanymi na ekranie powiadomieniami debugowania.
Johannes Pille,

Ach, bardzo fajne obejście - na pewno to da
Zach.

1
@ s_ha_dum: To nie tak, że ktoś pamięta każdą odpowiedź - przynajmniej ja nie (wcześniej przeglądałem własną odpowiedź). Ten jednak pamiętam. Jako pierwszy odpowiedziałem i napisałem bzdury. Nie dotyczyło wcale. Postępuję zgodnie z polityką, aby nie odpowiadać, chyba że mam co najmniej 99,5% pewności, że mam kwalifikacje (zakładam, że to samo dotyczy ciebie) - tutaj byłem daleko od celu. Martwiło mnie to, co żyje, więc kilka godzin później, po otrzymaniu akceptowanej odpowiedzi, wciąż myślałem o tym i wymyśliłem powyższe. Też myślę, że to całkiem sprytne - dzięki za zauważenie.
Johannes Pille,

3

Nie odpowiada dokładnie na twoje pytanie, ale z własnego doświadczenia wynika, że ​​lepiej włączyć tryb debugowania, dopasowując adres IP zamiast adresu URL.

Wymaga to modyfikacji łączy i rozwiązuje problem identyfikacji administratora, zanim WP załaduje wymaganą funkcjonalność użytkownika.


Właściwie podoba mi się również ten pomysł - więc gdybym zrobił coś takiego jak pastebin.com/m22KNakh, który mógłby ... w teorii działać, prawda? Uruchamianie echo $_SERVER['REMOTE_ADDR']plony ::1, które można oczekiwać na localhost? To szczerze brzmi jak osobny plik dziennika i w ten sposób (ponieważ domowe adresy IP wydają się cały czas zmieniać) może być dobrym pomysłem.
Zach

@Zach tak, ::1to tylko wersja IPv6 127.0.0.1. Dynamiczne IP sprawia, że ​​jest mniej wygodne, ale i tak traktuję to tylko jako tymczasową technikę rozwiązywania problemów na żywo. Nie zastępuje poprawnej lokalnej konfiguracji debugowania.
Rarst

Ach, dziękuję za informację. Zdecydowanie, podobnie jak obie opcje tutaj, idę z odpowiedzią @ s_ha_dum (oprócz twojego komentarza, który głosowałem), co jest również świetne. Jeszcze raz dziękuję, naprawdę to doceniam!
Zach.

1

Jest to również możliwa sztuczka, ale musisz to umieścić w swoim, wp-config.phpponieważ WP_DEBUGjest tam zdefiniowane:

if ( isset( $_GET['debugsecret'] ) && 'debugsecret' == $_GET['debugsecret'] ) {
      define( 'WP_DEBUG', true );         
}

Dodaj ?debugsecret=debugsecretdo adresu URL strony, którą chcesz debugować.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.