使用对象变量激活的问题&停用WordPress挂钩

时间:2010-10-30 03:04:33

标签: oop wordpress-plugin wordpress

首先,我想对这个非常大的问题说抱歉,但是由于我没有得到任何合适的答案,所有这些问题在过去几天都扰乱了我的小脑(或没有大脑!)。我会请求先慢慢阅读,如果知道任何一部分,请尝试仅针对该部分进行回答。我真的很感激能回答其中任何一部分的人。

我正在开发一个插件(使用OOP),玩家可以在这里注册&在线玩一些橄榄球比赛。为此,我创建了一个数据库表(wp_rugby_players),这样当使用注册Hooks的API时,这个表将自动创建和创建。激活&分别停用插件 但是,我必须提到这种创建数据库表是使用WordPress的一种不好的方式,因为它本身提供了许多选项(包括使用选项,自定义字段,分类法,......)来用于此类目的。

仍然这是我的第一次,我想知道如何使用OOP方式编写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: -
我必须在每个方法中编写相同的字符串(在本例中为表名),有多个实例,尽管我非常希望将其存储在某个类属性中。使用“register_activation_hook”,“register_deactivation_hook”,“add_action”,“add_filter”,“{{1} API的此解决方法的可行性是什么“}和”add_menu_page“?在调用刚才提到的API时,类属性的值是否可用。

add_submenu_page: -
如何知道Placeholder - #4是否有效?如果没有,如何使它在这个类方法中工作?

dbDelta($sql)& Placeholder - #6: -
我在一个非OOP插件中看到使用这两个检查“Placeholder - #7”& “function_exists('add_menu_page')”。这些检查是否有效?是否值得检查这两个API?

function_exists('add_submenu_page')& Placeholder - #6: -
正如我之前所说,这里有多个相同文本的实例。那里。其中一些例子是主菜单的“menu_slug”参数&子菜单的“parent_slug”参数。同样的情况也适用于菜单的“功能”参数。如果可能的话,我如何在这里使用类属性值,而不是直接在&上写入相同的文本。又一次?

一些常见问题: -

  • 我需要在管理员面板中有一个玩家注册表单,所以我需要一个视图&控制器&一个模型可能。所以任何人都可以建议一种可行的方法,以适当的方式这样做,因为这是这个插件中最微不足道的部分?
  • 每当我从插件管理器区域激活插件时,我收到以下消息“Placeholder - #7”任何人都可以从上面的书面中告诉我这是什么导致这种警告信息?< / LI>

任何了解其中任何一小部分的人,请仅回答该部分。在过去的几天里,我一直在挠头,没有回答上述问题。请帮帮我。提前谢谢。

2 个答案:

答案 0 :(得分:2)

The plugin generated 583 characters ...

在激活过程中,您不应输出任何文本 - 如果您这样做,WordPress将向用户显示此消息。开发插件时,应始终在wp-config.php中打开WP_DEBUG定义,以确保显示所有问题和警告文本。

dbdelta()本身就是一个法则 - 如果你搜索'dbdelta sandbox',你应该能够找到一种方法来运行并自己测试它。显然,当它创建/修改表时,你可以看到它是否正常工作。我倾向于将模式代码保存在文件中并删除注释行,然后再将其提供给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);

学习如何编写插件的方法是阅读其他插件代码,阅读优秀的文章和教程。绝对阅读Ozh关于10 mistakes plugin authors make的文章,但对我来说唯一最有用的是书"Professional WordPress Plugin Development" by Williams, Richards and Tadlock。它写得很好,并且以合乎逻辑,清晰明智的方式彻底描述了你需要知道的大部分事情。

答案 1 :(得分:1)

您将用作钩子回调函数的类中的任何方法都应具有 public 可见性 - 或者WP代码无权调用它们(例如database_setup&amp; database_uninstall, admin_action)。 即:

public function database_setup() ...