首先,我想对这个非常大的问题说抱歉,但是由于我没有得到任何合适的答案,所有这些问题在过去几天都扰乱了我的小脑(或没有大脑!)。我会请求先慢慢阅读,如果知道任何一部分,请尝试仅针对该部分进行回答。我真的很感激能回答其中任何一部分的人。
我正在开发一个插件(使用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>
任何了解其中任何一小部分的人,请仅回答该部分。在过去的几天里,我一直在挠头,没有回答上述问题。请帮帮我。提前谢谢。
答案 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() ...