Intereting Posts
Нужна помощь с пользовательским правилом перезаписи – http: // domain / custom post slug / replies Как я часто пассивно поддерживаю свои веб-сайты WordPress? Обратный звонок после завершения настройки WordPress реализация фотогалереи как tmz Как присвоить значение настраиваемого текстового окна ввода виджета переменной? Как добавить встроенную текстовую область в разработку темы? Обновление с 3.5.2 до 3.9.1 Возможно ли отобразить DIV для неавторизованных пользователей, а затем изменить его для пользователей, которые вошли в систему? Paged posts – как использовать числа и следующие / предыдущие ссылки? Как вы создаете блог WordPress с несколькими авторами, чтобы позволить что-то вроде «вики-страницы» в StackExchange? Есть ли способ запланировать автоматические обновления ядра WordPress? Импортировать большое количество изображений с сервера Заголовок изображения внутри ссылки <a> Ссылка на archive-page.php на single-page.php Добавление поиска в поле выбора

отладка register_activation_hook ()

Мне любопытно, есть ли известная проблема с WordPress или PHP, где среда может ухудшиться до такой степени, когда WordPress просто игнорирует вызовы register_activation_hook (). Я вытягивал свои волосы в течение часа в своей локальной среде, работающей с MAMP, когда у меня был сотрудник, проверяющий код на ее машине; точно такой же код работает на одном компьютере, но не на другом.

В этом случае я просто хотел добавить сообщения в файл журнала, который я обрабатываю в реальном времени.

error_log("Plugin code is being processed"); register_activation_hook( __FILE__, 'myplugin_activate' ); function myplugin_activate() { error_log("Attempting to activate"); die("Should not activate"); } 

Вывод на моем компьютере, на котором запущен MAMP, и щелкнуть ссылку «Активировать» под моим плагином:

 [22-Sep-2011 22:37:16] Plugin code is being processed [22-Sep-2011 22:37:16] Plugin code is being processed 

Solutions Collecting From Web of "отладка register_activation_hook ()"

Я чувствую себя немного плотным, не замечая этого раньше, но я наконец понял, что моя директория плагинов на моем компьютере является символической ссылкой на другое место, как указал Кунал Бхалла в символических ссылках с плагинами WP . Поскольку __FILE__ разрешает символические ссылки register_activation_hook() пытается загрузить файл за пределами пути плагинов WordPress.

Если вы посмотрите на функцию register_activation_hook() в файле plugin.php, вы увидите, что в plugin_basename() происходит plugin_basename() :

 function register_activation_hook($file, $function) { $file = plugin_basename($file); add_action('activate_' . $file, $function); } 

Дальнейшее исследование показывает, что plugin_basename() по существу выполняет замену шаблонов, пытаясь превратить системный путь в my_plugin/my_plugin.php ; однако, поскольку str_replace() использует WP_PLUGIN_DIR в качестве объекта, любой системный путь вне этого каталога плагина WordPress не будет производить соответствие для замены:

 function plugin_basename($file) { $file = str_replace('\\','/',$file); // sanitize for Win32 installs $file = preg_replace('|/+|','/', $file); // remove any duplicate slash $plugin_dir = str_replace('\\','/',WP_PLUGIN_DIR); // sanitize for Win32 installs $plugin_dir = preg_replace('|/+|','/', $plugin_dir); // remove any duplicate slash $mu_plugin_dir = str_replace('\\','/',WPMU_PLUGIN_DIR); // sanitize for Win32 installs $mu_plugin_dir = preg_replace('|/+|','/', $mu_plugin_dir); // remove any duplicate slash $file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir $file = trim($file, '/'); return $file; } 

Этот метод кажется немного коротким, и я нашел несколько решений: от определения дополнительных констант в wp-config.php до жесткого кодирования относительного пути вашего плагина. Вместо этого я считаю, что лучшим методом стоп-зазора может быть использование следующего шаблона, который предварительно определяет путь, plugin_basename() пытается извлечь plugin_basename() . Это можно использовать вместо __FILE__ в качестве первого параметра register_activation_hook() .

 basename( dirname( __FILE__ ) ).'/'.basename( __FILE__ ); 

Этот метод будет работать, только если ваш плагин имеет свою собственную папку в каталоге wp-content/plugins и вызывается из базового файла плагина. Оба эти условия, как правило, контролируют разработчика плагинов, хотя мне любопытно, есть ли у кого-то какие-то противоположные мысли.


Дополнительные ссылки:

Подумав немного, я думаю, что использование разрешенного поиска пути может быть более безопасным:

 function plugin_symlink_path( $file ) { // If the file is already in the plugin directory we can save processing time. if ( preg_match( '/'.preg_quote( WP_PLUGIN_DIR, '/' ).'/i', $file ) ) return $file; // Examine each segment of the path in reverse foreach ( array_reverse( explode( '/', $file ) ) as $segment ) { // Rebuild the path starting from the WordPress plugin directory // until both resolved paths match. $path = rtrim($segment .'/'. $path, '/'); if ( __FILE__ == realpath( WP_PLUGIN_DIR . '/' . $path ) ) { return WP_PLUGIN_DIR . '/' . $path; } } // If all else fails, return the original path. return $file; } 

Я использовал этот метод: вставьте следующий код в плагин. THEN активируйте его.

 function save_error() { file_put_contents(ABSPATH. 'wp-content/plugins/error_activation.html', ob_get_contents()); } add_action('activated_plugin','save_error'); 

после активации, откройте файл yoursite.com/wp-content/plugins/error_activation.html, чтобы узнать, какие ошибки произошли.