updateChecker = $updateChecker; if ( isset($panelClass) ) { $this->panelClass = $panelClass; } if ( (strpos($this->panelClass, '\\') === false) ) { $this->panelClass = __NAMESPACE__ . '\\' . $this->panelClass; } add_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); add_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow')); } /** * Register the PUC Debug Bar panel. * * @param array $panels * @return array */ public function addDebugBarPanel($panels) { if ( $this->updateChecker->userCanInstallUpdates() ) { $panels[] = new $this->panelClass($this->updateChecker); } return $panels; } /** * Enqueue our Debug Bar scripts and styles. */ public function enqueuePanelDependencies() { wp_enqueue_style( 'puc-debug-bar-style-v5', $this->getLibraryUrl("/css/puc-debug-bar.css"), array('debug-bar'), '20221008' ); wp_enqueue_script( 'puc-debug-bar-js-v5', $this->getLibraryUrl("/js/debug-bar.js"), array('jquery'), '20221008' ); } /** * Run an update check and output the result. Useful for making sure that * the update checking process works as expected. */ public function ajaxCheckNow() { //phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is checked in preAjaxRequest(). if ( !isset($_POST['uid']) || ($_POST['uid'] !== $this->updateChecker->getUniqueName('uid')) ) { return; } $this->preAjaxRequest(); $update = $this->updateChecker->checkForUpdates(); if ( $update !== null ) { echo "An update is available:"; //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- For debugging output. echo '
', esc_html(print_r($update, true)), '
'; } else { echo 'No updates found.'; } $errors = $this->updateChecker->getLastRequestApiErrors(); if ( !empty($errors) ) { printf('

The update checker encountered %d API error%s.

', count($errors), (count($errors) > 1) ? 's' : ''); foreach (array_values($errors) as $num => $item) { $wpError = $item['error']; /** @var \WP_Error $wpError */ printf('

%d) %s

', intval($num + 1), esc_html($wpError->get_error_message())); echo '
'; printf('
Error code:
%s
', esc_html($wpError->get_error_code())); if ( isset($item['url']) ) { printf('
Requested URL:
%s
', esc_html($item['url'])); } if ( isset($item['httpResponse']) ) { if ( is_wp_error($item['httpResponse']) ) { $httpError = $item['httpResponse']; /** @var \WP_Error $httpError */ printf( '
WordPress HTTP API error:
%s (%s)
', esc_html($httpError->get_error_message()), esc_html($httpError->get_error_code()) ); } else { //Status code. printf( '
HTTP status:
%d %s
', esc_html(wp_remote_retrieve_response_code($item['httpResponse'])), esc_html(wp_remote_retrieve_response_message($item['httpResponse'])) ); //Headers. echo '
Response headers:
';
							foreach (wp_remote_retrieve_headers($item['httpResponse']) as $name => $value) {
								printf("%s: %s\n", esc_html($name), esc_html($value));
							}
							echo '
'; //Body. $body = wp_remote_retrieve_body($item['httpResponse']); if ( $body === '' ) { $body = '(Empty response.)'; } else if ( strlen($body) > self::RESPONSE_BODY_LENGTH_LIMIT ) { $length = strlen($body); $body = substr($body, 0, self::RESPONSE_BODY_LENGTH_LIMIT) . sprintf("\n(Long string truncated. Total length: %d bytes.)", $length); } printf('
Response body:
%s
', esc_html($body)); } } echo '
'; } } exit; } /** * Check access permissions and enable error display (for debugging). */ protected function preAjaxRequest() { if ( !$this->updateChecker->userCanInstallUpdates() ) { die('Access denied'); } check_ajax_referer('puc-ajax'); //phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.runtime_configuration_error_reporting -- Part of a debugging feature. error_reporting(E_ALL); //phpcs:ignore WordPress.PHP.IniSet.display_errors_Blacklisted @ini_set('display_errors', 'On'); } /** * Remove hooks that were added by this extension. */ public function removeHooks() { remove_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); remove_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); remove_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow')); } /** * @param string $filePath * @return string */ private function getLibraryUrl($filePath) { $absolutePath = realpath(dirname(__FILE__) . '/../../../' . ltrim($filePath, '/')); //Where is the library located inside the WordPress directory structure? $absolutePath = PucFactory::normalizePath($absolutePath); $pluginDir = PucFactory::normalizePath(WP_PLUGIN_DIR); $muPluginDir = PucFactory::normalizePath(WPMU_PLUGIN_DIR); $themeDir = PucFactory::normalizePath(get_theme_root()); if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { //It's part of a plugin. return plugins_url(basename($absolutePath), $absolutePath); } else if ( strpos($absolutePath, $themeDir) === 0 ) { //It's part of a theme. $relativePath = substr($absolutePath, strlen($themeDir) + 1); $template = substr($relativePath, 0, strpos($relativePath, '/')); $baseUrl = get_theme_root_uri($template); if ( !empty($baseUrl) && $relativePath ) { return $baseUrl . '/' . $relativePath; } } return ''; } } endif;