отладка "register_activation_hook" в WordPress - PullRequest
1 голос
/ 09 мая 2009

Я пытаюсь научиться писать плагин для WordPress, ставя перед собой цель написать сгенерированный пользователем плагин глоссария после того, как я спросил людей в Twitter, что было бы полезно (ну, я могу также использовать свой опыт обучения, чтобы быть полезным для больше, чем я).

В любом случае, при установке плагин устанавливает таблицу базы данных и добавляет к ней некоторые тестовые данные. Затем, когда отображается содержимое, цикл foreach меняет каждую фразу и заменяет ее плавающим блоком DHTML.

Проблема, однако, в том, что я не могу понять, что происходит с register_activation_hook; это может быть вызвано, и SQL не работает, или это не может быть вызвано (так или иначе у меня нет дополнительной таблицы в базе данных после того, как я активирую плагин).

Крюк выглядит так:

register_activation_hook(__FILE__, "bot_install");

И код bot_install, как этот

function bot_install()
{
    global $wpdb;
    $table = $wpdb->prefix."sh_gloss";

    $structure = "CREATE TABLE $table (
        id INT(9) NOT NULL AUTO_INCREMENT,
        phrase VARCHAR(80) NOT NULL,
        desc VARCHAR(255) NOT NULL,
    UNIQUE KEY id (id)
    );";
    $wpdb->query($structure);

    // Populate table
    $wpdb->query("INSERT INTO $table(phrase, desc)
        VALUES('Scott Herbert', 'Rockstar Programmer')");

}

ОК, так что, во-первых, пожалуйста, прости запись в базе данных эго, это только для тестирования ...

Во-вторых, есть ли что-то, что я должен был увидеть, что я пропустил? И в-третьих (и самое главное), как я могу отладить "bot_install"? Могу ли я просто добавить заявления вроде:

echo "in xxxx";

или это испортит заголовки (так как я предполагаю, что весь этот код запускается перед основным выводом).

Ответы [ 3 ]

2 голосов
/ 04 апреля 2015

Чтобы ответить на ваш третий (и «самый важный»!) Вопрос, очень поздно.

Чтобы отладить ошибки активации, добавьте действие в хук activated_plugin, чтобы записать выходной буфер (который будет содержать ваши ошибки) в файл, а затем проверьте его.

Возможно, вы также захотите включить отладку в файле конфигурации , чтобы получить дополнительную информацию о вашем файле.

function save_output_buffer_to_file()
{
    file_put_contents(
      ABSPATH. 'wp-content/plugins/activation_output_buffer.html'
    , ob_get_contents()
    );
}
add_action('activated_plugin','save_output_buffer_to_file');
0 голосов
/ 11 мая 2009

Я должен был иметь дело с этим некоторое время назад. С register_activation_hook есть что-то хитрое, по какой-то причине выполнение запросов у меня не работает, используйте функцию dbDelta.

function bot_install()
{
    global $wpdb;
    $table = $wpdb->prefix."sh_gloss";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    $structure = "CREATE TABLE $table (
        id INT(9) NOT NULL AUTO_INCREMENT,
        phrase VARCHAR(80) NOT NULL,
        desc VARCHAR(255) NOT NULL,
        UNIQUE KEY id (id));";

    dbDelta($structure);


    // Populate table
    $wpdb->query("INSERT INTO $table(phrase, desc)
        VALUES('Scott Herbert', 'Rockstar Programmer')");

}

Дайте мне знать, если это не сработает.

0 голосов
/ 09 мая 2009

Я ничего не знаю о WordPress, но ... поскольку в коде нет обработки ошибок, откуда вы знаете, что $wpdb является допустимым дескриптором подключения к базе данных, и как код может обнаружить, что что-то не работает - например, оператор CREATE TABLE не выполнен? Код, по-видимому, слепо (беспечно) предполагает, что ничто не может или не пойдет не так, но мой опыт показывает, что все может пойти и не получится.


Я все еще не эксперт, но ссылка , на которую ссылаются, говорит:

Запустить любой запрос к базе данных

Функция запроса позволяет вам выполнить любой SQL-запрос к базе данных WordPress. Однако для запросов SELECT лучше использовать более конкретную функцию (см. Ниже).

<?php $wpdb->query('query'); ?> 

запрос

(строка) SQL-запрос, который вы хотите выполнить.

Функция возвращает целое число, соответствующее количеству затронутых / выбранных строк. В случае ошибки MySQL функция вернет FALSE. (Примечание: так как 0 и FALSE могут быть возвращены, убедитесь, что вы используете правильный оператор сравнения: равенство == против идентичности ===).

[...]

Примеры

Удалите мета-ключ 'gargle' и значение из Поста 13.

   $wpdb->query("
       DELETE FROM $wpdb->postmeta WHERE post_id = '13'
             AND meta_key = 'gargle'");

Итак, предположительно, если операция CREATE TABLE завершится неудачно, вы получите от нее ЛОЖЬ, которую вы можете проверить с помощью соответствующего оператора - я не уверен, какой это.

Далее, на предмет ошибок, на странице написано:

Показать и скрыть ошибки SQL

Вы можете включить или выключить отображение ошибок с помощью show_errors и hide_errors соответственно.

<?php $wpdb->show_errors(); ?>
<?php $wpdb->hide_errors(); ?> 

Вы также можете распечатать ошибку (если есть), сгенерированную самым последним запросом, с помощью print_error.

<?php $wpdb->print_error(); ?> 

Наконец, для отладки во время начальной разработки не будет иметь большого значения, искажается ли ответ, пока вы можете видеть информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...