gpt4 book ai didi

oop - 使用对象变量激活和停用 WordPress Hook 的问题

转载 作者:行者123 更新时间:2023-12-04 06:42:41 24 4
gpt4 key购买 nike

首先,我想对这个非常大的问题表示歉意,但是在过去的几天里,所有这些问题都困扰着我的小大脑(或没有大脑!),因为我没有得到任何合适的答案。要求先慢读,有知道部分的请尽量只回答那部分。我将非常感谢任何回答其中任何部分的人。

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

由于这是我的第一次,我想知道在这种情况下如何使用 OOP 编程 WordPress 插件的方式进行。问题是我的钩子(Hook)注册没有完全工作,并且出现了一些问题。因此,如果有人可以帮助我,那就太好了。以下是我的代码片段:-

// 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”、“ add_menu_page”和“ add_submenu_page”的 API 使用此变通方法的可行性是什么?调用刚才提到的 API 时,这些类属性的值是否可用。

Placeholder - #4 :-
如何知道 dbDelta($sql)工作与否?如果没有,如何使它在这个类方法中工作?

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

Placeholder - #6 & Placeholder - #7 :-
正如我之前所说,这里和那里有多个相同文本的实例。它们的更多示例是主菜单的“menu_slug”参数和子菜单的“parent_slug”参数。同样的情况也适用于菜单的“能力”参数。如果可能的话,我怎样才能在这里使用类属性值,而不是直接一遍又一遍地写相同的文本?

一些一般性问题 :-
  • 我需要在管理面板中有一个玩家注册表格,所以我可能需要一个 View 、 Controller 和模型。那么任何人都可以建议一种以适当方式执行此操作的可能方法,因为这是该插件中最微不足道的部分?
  • 每当我从插件管理器区域激活插件时,我都会收到以下消息“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.”任何人都可以从上面的文字中知道什么会导致这种警告消息吗?

  • 谁知道它的任何一小部分,请只回答那部分。在过去的几天里,我一直在摸不着头脑,没有回答上述这些问题。请帮帮我。提前致谢。

    最佳答案

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

    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);

    学习如何编写插件的方法是阅读其他插件代码,以及阅读好的文章和教程。一定要阅读 Ozh 在 10 mistakes plugin authors make 上的文章,但对我最有帮助的是这本书 "Professional WordPress Plugin Development" by Williams, Richards and Tadlock .它写得很好,并以合乎逻辑、清晰和明智的方式彻底描述了你需要知道的大部分事情。

    关于oop - 使用对象变量激活和停用 WordPress Hook 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4057069/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com