Проблемы в использовании объектной переменной для активации и деактивации хуков WordPress - PullRequest
2 голосов
/ 30 октября 2010

Прежде всего, я хочу извиниться за этот очень большой вопрос, но все эти вопросы беспокоили мой маленький мозг (или не мозг!) В течение прошлых нескольких дней, поскольку я не получил никакого подходящего ответа.Я попрошу сначала прочитать это медленно, и кто бы ни знал какую-либо его часть, пожалуйста, попробуйте ответить на нее только для этой части.Я действительно буду благодарен любому, кто ответит на любую его часть.

Я разрабатываю плагин (используя ООП), где игроки могут зарегистрироваться здесь и сыграть в какую-нибудь игру в регби онлайн.Для этого я создал таблицу базы данных (wp_rugby_players) таким образом, чтобы при использовании API регистрации хуков эта таблица автоматически создавалась и удалялась при активации и деактивации плагина, соответственно.
Однако я должен упомянутьчто такого рода создание таблицы базы данных является плохим способом использования WordPress, поскольку она сама предоставляет множество опций (которые включают использование опций, пользовательских полей, таксономий и т. д.) для использования в таких целях.

Тем не менее, так как это мой первый раз, я хотел бы знать, как действовать в таких случаях, используя ООП способ программирования плагинов WordPress.Проблема в том, что моя регистрация хуков не работает полностью, и возникают некоторые проблемы.Так что, если кто-нибудь может мне помочь, пожалуйста, это будет просто здорово.Ниже приведен мой фрагмент кода: -

// Placeholder - #1
class class_play_rugby_game
{
    function __construct() {
        // Placeholder - #2
        register_activation_hook( __FILE__, array( &$this, 'database_setup' ) );
        register_deactivation_hook( __FILE__, array( &$this, 'database_uninstall' ) );
        add_action( 'admin_menu', array( &$this, 'admin_actions' ) );
    }


    function database_setup() {
        global $wpdb;

        // Placeholder - #3
        $table_name = $wpdb->prefix . "top_rugby_players";
        $current_year = date('Y');

        if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
            $sql = "CREATE TABLE `".$table_name."`......"; // Database Table Creation Code correct, as I have checked it using "phpMyAdmin"

            /**
             * This code snippet is actually taken from a non-OOP Plugin code,
             * but still I would want to use it in case anything goes wrong.
             */
            if( !require_once(ABSPATH . 'wp-admin/includes/upgrade.php') ) {
                die('Foolish Plugin has added its own maybe_upgrade* Function');
            }

            // Placeholder - #4
            dbDelta($sql);

            $welcome_name = "Mr. Wordpress";
            $welcome_text = "Congratulations, you just completed the installation!";

            // Just for testing
            $rows_affected = $wpdb->insert( $table_name, array(
                'name' => $welcome_name,
                'time' => current_time('mysql'),
                'text' => $welcome_text
            ) );
        }
    }


    function database_uninstall() {
        global $wpdb;

        // Placeholder - #5
        $table_name = $wpdb->prefix . "top_rugby_players";
        $wpdb->query("DROP TABLE IF EXISTS $table_name");
    }


    function admin_actions() {
        // Placeholder - #6
        if( function_exists('add_menu_page') ) {
            add_menu_page( __("Play Rugby Game"), __("Top Rugby Players"), 'edit_plugins', "list-top-players" );
        }

        // Placeholder - #7
        if( function_exists('add_submenu_page') ) {
            add_submenu_page( "list-top-players", __("List of Top Players"), __("Top Rugby Players"), 'edit_plugins', "list-top-players", array($this, "list_top_players_page"));

            add_submenu_page( "list-top-players", __("Add Top Players"), __("Add New"), 'edit_plugins', "add-new-player-page", array($this, "add_new_player_page"));
        }
    }
}

$obj_play_rugby_game = new class_play_rugby_game();

Теперь я расскажу все проблемы, одну за другой.
Placeholder - #1: -
Есть ли проблемы смоя структура именования классов?Если да, пожалуйста, дайте мне знать, чтобы я мог следовать стандартам.

Placeholder - #2: -
Я немного сбит с толку относительно того, где и как правильно использовать объект этого класса в функциях "register_activation_hook" & "register_deactivation_hook».Кроме того, они синтаксически правильно расположены внутри конструктора?

Placeholder - #3 & Placeholder - #5: -
Есть несколько случаев, когда мне приходится писать одну и ту же строку (в данном случае имя таблицы) в каждом методе, хотя я бы оченьтак же, как это хранить в некотором свойстве класса вместо этого.Какова была бы целесообразность этого обходного пути для работы с API "register_activation_hook", "register_deactivation_hook", "add_action", "add_filter", "add_menu_page" и "add_submenu_page"?Будет ли доступно значение свойств класса при вызове только что упомянутых API.

Placeholder - #4: -
Как узнать, работает ли dbDelta($sql) или нет?Если нет, то как заставить его работать в этом методе класса?

Placeholder - #6 & Placeholder - #7: -
Я видел в плагине не-OOP, использующем эти 2 проверки "function_exists('add_menu_page') "&" function_exists('add_submenu_page') ".Работают ли эти проверки и стоит ли проверять эти два API?

Placeholder - #6 & Placeholder - #7: -
Как я уже говорил, существует несколько экземпляров одного и того же текста.здесь.Еще несколько примеров из них - параметр «menu_slug» главного меню и параметр «parent_slug» подменю.То же самое относится и к параметру «возможности» меню.Если возможно, как я могу использовать значения свойств класса здесь, вместо того, чтобы писать один и тот же текст снова и снова?

Некоторые общие вопросы : -

  • Мне нужно иметь регистрационную форму игрока в панели администратора, поэтому мне, вероятно, потребуются вид, контроллер и модель.Так может кто-нибудь предложить, пожалуйста, возможный способ сделать это надлежащим образом, так как это самая тривиальная часть этого плагина?
  • Всякий раз, когда я активирую плагин из области диспетчера плагинов, я получаюследующее сообщение "The plugin generated 585 characters of unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin." Кто-нибудь может сказать, пожалуйста, из написанного выше, что может вызвать такого рода предупреждающее сообщение?

Любой, кто знает какую-либо небольшую часть этого, пожалуйста, ответьте только на эту часть,Последние несколько дней я ломаю голову, не отвечая на эти вопросы.Пожалуйста, помогите мне.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 05 июля 2012

The plugin generated 583 characters ...

Во время процесса активации вы не должны выводить какой-либо текст - если вы это сделаете, WordPress отобразит это сообщение для пользователя. При разработке плагина вы всегда должны делать это с включенным определением WP_DEBUG в wp-config.php, чтобы вы могли видеть все проблемы и отображаемый текст предупреждения.

dbdelta () - это своего рода закон - если вы ищете «песочницу dbdelta», вы сможете найти способ запустить и протестировать ее самостоятельно. Очевидно, вы можете увидеть, работает ли он, когда он создает / изменяет ваши таблицы. Я предпочитаю хранить код схемы в файле и удалять строки комментариев перед передачей в dbdelta ():

$sql = file_get_contents(MYPLUGIN_PATH . "/schema.sql");
if (empty($sql))
    die("Could not read schema.sql file");

// Remove comments and localize wp_ prefix
$sql = preg_replace('/^#.*\n/m', '', $sql);
$sql = preg_replace(
    '/^(CREATE TABLE .*`)wp_/m',
    '\1' . $wpdb->prefix,
    $sql
);

// Auto-magically create/update mysql table structure
require_once(admin_path('includes/upgrade.php'));
dbDelta($sql);

Способ узнать, как написать плагин, - это прочитать другой код плагина и прочитать хорошие статьи и учебные пособия. Обязательно прочитайте статью Ожа о 10 ошибках, которые авторы плагинов совершают , но самой полезной вещью для меня была книга "Профессиональная разработка плагинов для WordPress" Уильямса, Ричардса и Тэдлока . Он хорошо написан и подробно описывает большинство вещей, которые вам нужно знать, логичным, ясным и осмысленным способом.

1 голос
/ 26 июля 2011

Любые методы в вашем классе, которые вы будете использовать в качестве функции обратного вызова для хуков, должны иметь public видимость - или код WP не будет иметь доступа для их вызова (например, database_setup & database_uninstall, admin_action) , i.e.:

public function database_setup() ...
...