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.