Xác định WP_DEBUG theo điều kiện / chỉ dành cho quản trị viên / lỗi đăng nhập (nối thêm truy vấn arg cho tất cả các liên kết?)


20

Tôi đang phát triển một trang web trên máy chủ mà khách hàng cũng có quyền truy cập và những gì tôi muốn làm WP_DEBUGchỉ hiển thị cho quản trị viên. Tham khảo bài viết của Yoast về cách này:

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

sẽ WP_DEBUGchỉ hiển thị cho các URL đã được ?debug=trueđính kèm với chúng, nhưhttp://domain.com/?debug=true

Tôi đã nghĩ rằng Debug Bar có thể chứa một số thông tin này trong đó theo mặc định (có bật hay không WP_DEBUG), nhưng tôi đã nghĩ rằng điên rồ vì tôi không tin đó là trường hợp.

Vì vậy, những gì tôi nghĩ sẽ hữu ích, sẽ là kiểm tra cho người dùng hiện tại (có manage_optionskhả năng và sau đó chạy các liên kết thông qua add_query_arg():

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

nhưng điều tôi không chắc chắn là - có một cái móc nào tôi có thể sử dụng để thực hiện tất cả các liên kết trên một trang web với điều này không? Bằng cách này, quản trị viên luôn thấy gỡ lỗi mà tôi nghĩ sẽ cực kỳ hữu ích. Cảm ơn vì sự giúp đỡ như mọi khi!


Cách giải quyết này (của Yoast) cực kỳ hữu ích cho việc gỡ lỗi. Tôi cũng kích hoạt đăng nhập hoạt động tốt. Tôi đã sửa đổi một chút mã của mình: if ( isset( $_GET['bug'] ) ) vì vậy tôi truy cập link /? Bug để xem gỡ lỗi :)
Jarmerson

Câu trả lời:


18

Tôi không nghĩ rằng có một móc nối URL phổ quát. Có rất nhiều móc và tôi có thể đã bỏ lỡ nó, nhưng tôi không nghĩ có một cái móc. Bạn có thể xem qua các hook tại adambrown.info . Có rất nhiều móc nối URL, nhưng không phải là một cái phổ quát.

Nếu tôi có thể đề xuất một giải pháp khác: Ghi nhật ký lỗi vào một tệp.

/**
 * 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);

Mã đó trực tiếp từ Codex cho tệp wp-config.php . Nếu bạn làm điều đó, bạn sẽ không phải lo lắng về việc tung hứng $_GEThoặc phân loại ai là ai và ai không phải là quản trị viên.

Chỉnh sửa:

Tôi quên một giải pháp có thể. Bạn có thể làm điều này với Javascript. Một tập lệnh ngắn có thể đính kèm tham số của bạn vào tất cả các URL trên trang và bạn có thể dễ dàng tải tập lệnh chỉ cho quản trị viên.

Tôi vẫn đề xuất giải pháp 'đăng nhập' vì lỗi cho mọi người được ghi lại. Nếu người của bạn giống như tôi và gửi lỗi 'báo cáo' như "này , trang web bị hỏng khi bạn thực hiện mẫu đó ", bạn sẽ đánh giá cao nhật ký. :)


Tôi đoán tôi chỉ thấy hư hỏng khi nhìn thấy chúng trên màn hình :) nhưng một tệp nhật ký sẽ có ý nghĩa hơn ở đây. Sẽ nghiên cứu thêm một chút về kết thúc của tôi, nhưng đây dường như là giải pháp tốt nhất mà tôi đã đi qua. Cảm ơn!
Zach

5
Lưu ý rằng ghi nhật ký gốc được mã hóa cứng để đăng nhập vào tệp có thể truy cập web, đây không phải là ý tưởng hay trong sản xuất. Tốt hơn là định cấu hình vị trí tệp nhật ký riêng tư (ngoài thư mục web) thông qua phương tiện PHP cho các trang web trực tiếp.
Hết

9

Mặc dù cách tiếp cận đầu tiên của tôi là về thùng rác và câu trả lời s_ha_dums là sạch sẽ, và có lẽ là cách tốt nhất để giải quyết vấn đề này, hãy để tôi đưa ra một kịch bản làm việc nữa:

Phần sau đây đặt cookie có giá trị trong 24 giờ tới (86400 giây) khi quản trị viên đăng nhập vào hệ thống. Trong wp-config.php , hằng số WP_DEBUGđược xác định theo điều kiện tùy thuộc vào sự hiện diện và giá trị của cookie đã nói.

Hãy cẩn thận: WP_DEBUGsau đó sẽ được đặt thành truecho tất cả mọi người đăng nhập từ cùng một trình duyệt trên cùng một máy trong cùng một ngày.

trong Hàm.php (hoặc dưới dạng plugin):

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 );

Xem: Codex> Tham chiếu hành động> wp_login

trong wp-config.php :

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

Andrew Nacin bình luận về bài báo đó, đề cập initlà quá muộn để có bất kỳ ảnh hưởng. Tôi cũng đã thử điều này và nó đã không hoạt động.
Zach

Các hằng số không thể được định nghĩa lại. Người ta có thể sửa đổi mức báo cáo lỗi mà không chạm vào hằng số nhưng nó không hoàn hảo. Ngoài ra có rất nhiều điều xảy ra trước initđó là quan tâm.
Hết

Tôi nghĩ rằng câu trả lời được chấp nhận vẫn là giải pháp khả thi nhất, tuy nhiên, để hoàn thiện, phương pháp mới này phải thực hiện công việc với các thông báo gỡ lỗi trên màn hình.
Julian Pille

Cách giải quyết rất tuyệt vời - chắc chắn sẽ thực hiện điều này
Zach

1
@s_ha_dum: Nó không giống như một người nhớ mỗi câu trả lời - ít nhất là tôi không (tôi đã googled câu trả lời của riêng tôi trước đây). Điều này tôi nhớ mặc dù. Tôi là người đầu tiên trả lời và đã viết tào lao tuyệt đối. Không áp dụng gì cả. Tôi tuân theo chính sách để không trả lời trừ khi tôi chắc chắn ít nhất 99,5% tôi đủ điều kiện (tôi cho rằng điều tương tự cũng xảy ra với bạn) - ở đây tôi đã bị loại khỏi mục tiêu. Điều đó làm phiền cuộc sống của tôi, vì vậy vài giờ sau, sau khi nhận được câu trả lời chấp nhận, tôi vẫn nghĩ về điều này và đưa ra những điều trên. Tôi cũng nghĩ rằng nó khá hấp dẫn - cảm ơn vì đã chú ý.
Julian Pille

3

Nó không trả lời chính xác câu hỏi của bạn, nhưng từ kinh nghiệm cá nhân tôi thấy tốt hơn là nên bật chế độ gỡ lỗi bằng cách khớp địa chỉ IP thay vì URL.

Điều đó đòi hỏi phải sửa đổi các liên kết và giải quyết cách xác định quản trị viên trước khi WP tải chức năng người dùng cần thiết.


Tôi thực sự cũng thích ý tưởng này - vì vậy nếu tôi đã làm một cái gì đó như pastebin.com/m22KNakh có thể ... trong lý thuyết hoạt động, đúng không? Chạy echo $_SERVER['REMOTE_ADDR']năng suất ::1dự kiến ​​trên localhost? Nó thực sự nghe giống như một tệp nhật ký riêng biệt và theo cách này (vì IP gia đình dường như thay đổi mọi lúc) có thể là một ý tưởng tốt.
Zach

@Zach yeah, ::1chỉ là phiên bản IPv6 của 127.0.0.1. Dynamic IP làm cho ít thuận tiện hơn, nhưng dù sao tôi chỉ coi đây là kỹ thuật khắc phục sự cố tạm thời cho các công cụ sống. Không thay thế thiết lập gỡ lỗi cục bộ thích hợp.
Hết

Ah cảm ơn đã cho tôi biết. Chắc chắn giống như cả hai tùy chọn ở đây, tôi sẽ đi với câu trả lời @s_ha_dum (ngoài nhận xét của bạn mà tôi nêu lên) cũng rất tuyệt. Cảm ơn một lần nữa, tôi thực sự đánh giá cao nó!
Zach

1

Đây cũng là một mẹo có thể, nhưng bạn cần phải đặt nó trong wp-config.phpđó vì WP_DEBUGđược xác định trong đó:

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

Thêm vào ?debugsecret=debugsecretURL trang bạn muốn gỡ lỗi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.