启动社区Wiki,以收集用于插件开发的客观最佳实践。这个问题的灵感来自@EAMann对wp-hackers的评论。

想法是就可能的客观最佳实践进行协作,以便我们最终可以在某些社区协作审核过程中使用它们。 />
更新:在看到前几个回答后,很明显每个答案我们只需要一个想法/建议/最佳实践,人们应该查看列表以确保发布前没有重复。

评论

我真的不明白社区Wiki应该如何在SE(以及其他)上与SE一起正常工作,但这也许是关于meta的问题。它只会在答案中堆积大多数骗子。

@hakre:好点。看到问题后,我将在描述中添加一些内容,即每个“答案”仅应添加一个主意,然后将现有答案更改为多个答案。

相关阅读:WordPress插件中最常见的10大错误

#1 楼

使用动作和过滤器
如果您认为人们想要添加或更改某些数据,请在返回之前提供apply_filters()。

PS。我觉得有些令人失望,您要解决的问题是只为最终用户设计的插件所占的百分比,即没有钩子的插件。想象一下WordPress是否像大多数插件一样设计?这将是不灵活且非常利基的解决方案。
如果WordPress能够自动安装其他插件所依赖的插件,也许情况会有所不同。因为通常情况下,我通常必须从头开始编写很多我需要的功能,因为客户需要某种方式的东西和可用的插件,尽管那里有90%,但不允许我灵活更新其余的10%。 />我真的很希望那些领导WordPress社区的人能够找到一种方法,以确保奖励插件以遵循最佳实践(例如为其他开发人员添加挂钩),就像在StackExchange网站上获得好的答案一样。

让我们从另一个问题中举一个例子:

例子:当某人转推一篇文章时,我想在我的插件中做些事情。如果任何流行的转推插件中都有一个自定义钩子,我可以将其钩住并解雇,那将很棒。没有,所以我可以修改他们的插件以包括它,但这仅适用于我的副本,并且我不想尝试重新分发它。

相关

提供可扩展形式


#2 楼

使用wp_enqueue_scriptwp_enqueue_style加载脚本/ CSS

插件不应加载/尝试加载JS / CSS文件的重复版本,尤其是jQuery和WP Core中包含的其他JS文件。
插件应始终链接JS和CSS文件时,请使用wp_enqueue_scriptwp_enqueue_style,而切勿直接通过<script>标签直接使用。
相关

重新使用现有功能


评论


建议:可能值得在其中使用依赖项(因为它是排队系统的一部分)。

– t31os
2011-2-17在18:26

正确,但更好的方法是先注册样式和脚本,然后通过ID将其排入队列。这对于其他开发人员更改脚本或在自定义插件中使用脚本非常好。更改顺序或创建总结文件也更加容易。

– Bueltge
2012年9月19日在21:35

另外,在需要时在页面上加载脚本和样式。 scribu.net/wordpress/optimal-script-loading.html

– M-R
2012-12-12 9:38

#3 楼

I18n支持

所有输出字符串都应链接到适当的文本域,以允许感兴趣的各方进行国际化,即使开发人员对翻译自己的插件没有兴趣。

请注意,在init操作期间加载语言文件非常重要,这样用户就可以参与该操作。

请参阅Codex:适用于WordPress开发人员的I18n

还有这篇文章:正确加载WP语言文件。

由于WordPress 4.6+

WP 4.6更改了加载顺序和检查位置,因此变得更加容易针对开发人员和用户。

考虑到带有文本域“ my-plugin”的插件,WordPress现在将首先在以下位置查找翻译文件:/ wp-content / languages / plugins / my-plugin-en_US .mo

如果未能在其中找到一个,它将在插件指示其查找的位置寻找一个(通常是在pluigns“语言”文件夹中,如果遵循编解码器):/ wp-content /插件/ my-pl ugin / languages / my-plugin-en_US.mo

最后,如果找不到语言文件,它将检查以下位置的默认位置:/wp-content/languages/my-plugin-en_US.mo

第一次检查是在4.6中添加的,它为用户提供了一个定义的位置来添加语言文件,就像以前他们需要知道开发人员在何处添加语言文件一样,现在用户只需要知道插件的textdomain :
/wp-content/languages/plugins/TEXTDOMAIN-LOCAL.mo


下面是旧方法(自4.6或更高版本起不相关)


[...]
最后,我想指出,在加载插件随附的语言文件之前,从WP_LANG_DIR加载自定义用户语言文件很重要。当为同一个域加载多个Mo文件时,将使用第一个找到的翻译。这样,插件提供的语言文件将作为用户未翻译的字符串的备用。


public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}


评论


对我来说最重要的一个。这样做并不需要很多额外的工作,但是可以使您的插件对数百万不以英语为母语的用户更加有用。您甚至不必自己翻译任何单词,而是准备要翻译的所有内容。

– 2ndkauboy
2010年8月29日在20:23

这是一件很有价值但很容易做到的事情,只是想说我同意,每个插件作者都应该这样做。

– t31os
2011-2-17在18:23

#4 楼

确保使用WP_DEBUG
不会产生任何错误
始终在打开WP_DEBUG的情况下测试您的插件,并且最好在整个开发过程中都将其打开。插入WP_DEBUG的插件不应引发任何错误。其中包括已弃用的通知和未检查的索引。
要打开调试,请编辑wp-config.php文件,以便将WP_DEBUG常量设置为true。有关更多详细信息,请参见《 Debug上的Codex》。

评论


请参阅有关每个答案仅具有最佳实践的更新。您可以分为多个答案吗?

– MikeSchinkel
2010年8月23日在16:36

好没问题。对于那个很抱歉。

– John P Bloch
10年8月23日在17:02

谢谢,不是您的疏忽,是我的。我根据@hakre关于重复项以及如何进行此工作的问题,对问题进行了修订,以寻求每个答案的最佳实践。

– MikeSchinkel
10年8月23日在18:32

如果我能两次赞成这个答案,我会的。当我在开发站点上工作并且不得不关闭WP_DEBUG时,这真令人沮丧,因为我需要使用的插件在各处发出警告和通知。

–伊恩·邓恩
2012年8月28日16:04

#5 楼

首次使用WordPress核心中的现有功能
如果可以:使用WordPress核心中包含的现有功能,而不是编写自己的功能。只有在WordPress核心中没有适当的预先存在的函数时,才开发自定义PHP函数。
一个好处是您可以使用“日志弃用的通知”轻松监视应替换的函数。另一个好处是,即使他们不是经验丰富的PHP开发人员,用户也可以查看Codex中的功能文档并更好地了解该插件的功能。
相关

I18n支持
加载脚本/ CSS和wp_enqueue_script和wp_enqueue_style
提供可扩展形式


评论


这里最大的问题之一是了解存在适当的现有功能。有用的地方将是张贴代码和/或功能的地方,以使社区能够对最佳使用的功能进行评论。也许StackExchange可以用于此?

– MikeSchinkel
2010年8月25日在20:20

h那将是非常困难的,我想这是无尽的任务。我认为以这种方式扩展法典将是最好的,因为它已经存在。

– kaiser
2010年8月27日在6:53

我猜想扩展Codex,也许从那里链接到相关的股票交易所线程就足够了。

– kaiser
2010年8月27日23:49

这样做的问题是,很多核心并不是真正为可重用性而设计的。我只需要复制并稍微修改一半的图像处理/元数据函数,以创建自己的类似附件的行为后类型,就像因为downsize()这样的函数调用某些函数,其中包含对后类型='附件的硬编码检查'。还有很多类似的例子,例如不灵活的wp_count_posts()。在真正重用之前,核心WP需要进行完整的重构。

– wyrfel
2011-2-16在10:04

对此完全同意。我一直以来最喜欢的示例:wp-login.php。因此,“如果可以的话”是答案的一个很好的起点。

– kaiser
2011-2-16在10:08

#6 楼

卸载应删除插件的所有数据
从WordPress安装中删除插件后,插件应删除其创建的所有文件,文件夹,数据库条目和表以及所创建的选项值。
插件可以提供导出/导入设置的选项,以便可以在删除之前将设置保存在WordPress之外。
相关的

停用应不会引起数据丢失


评论


这应该是默认行为,是的,但是它还应该提示用户保留一些数据……就像在卸载视频游戏时询问您是否要删除保存的游戏和下载的资料。用户可能只是出于测试目的而停用了插件,并且不想在重新激活插件时返回设置自己的选项。

–EAMann
2010年8月23日14:24

我只说的是什么时候完全删除插件,而不是什么时候停用插件。

–特拉维斯·诺斯库特(Travis Northcutt)
2010年8月23日在16:33

我知道...但是有时候我会删除插件,以便可以从尚未托管在存储库中的备份或Beta版本中手动重新添加插件...

–EAMann
10年8月23日在18:29

@EAMann:为此,为了将插件迁移到另一台服务器,插件应提供一种导出和导入设置的机制。

– hakre
10年8月24日在9:18

我已经看到一些插件在其设置中提供了“卸载”按钮,并带有红色大警告,它将删除所有数据。这与停用是分开的,我认为这是一种很好的处理方式。并非所有人都使用“删除”按钮来删除插件。

–加布里埃尔克
2011年6月21日在16:20



#7 楼

防止使用输入数据进行SQL注入

在使用输入值查询MySQL数据库之前,插件应清除直接或间接(例如,通过$_POST$_GET)检索到的所有用户输入。

请参阅:格式化SQL语句。

评论


您还应该清除数据库中的数据。基本上,永远不要信任任何未经硬编码的数据。 codex.wordpress.org/Data_Validation也是一个很好的参考。

–伊恩·邓恩
2011年6月20日22:57



#8 楼

给所有全局命名空间项目添加前缀
插件应正确地为所有全局命名空间项目添加前缀(常量,函数,类,变量,甚至诸如自定义分类法,帖子类型,小部件等)。例如,不要创建一个名为init()的函数;相反,应使用类似jpb_init()的名称。
它的常见用法是在名称前面使用三个或四个字母前缀,或使用PHP命名空间功能。比较:PHP类常量的单字母前缀吗?
相关

全局命名空间是有限的资源


#9 楼

使用类和面向对象的PHP5代码

没有理由不编写干净的,面向对象的PHP5代码。在下一个发行版(WP 3.1)之后,将逐步取消对PHP4的支持。当然,您可以为所有函数名称加上前缀endlessly_long_function_names_with_lots_of_underscores,但是编写一个简单的类并将其中的所有内容捆绑在一起要容易得多。另外,将您的课程放在一个单独的文件中并相应地命名,以方便您进行扩展和维护:

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}


评论


不要使用新的MyCoolPlugin();我认为最好通过Hook挂接WP:plugins_loaded

– Bueltge
2010-10-15 12:54

不确定。根据法典插件,plugins_loaded是最先加载的东西之一,因此我认为执行这样的构造或将其添加为动作没有什么区别。

–沙哑
2010-10-15 21:07

它只是使每个人都变得更好的最佳实践之一。

– Arlen Beiler
2010-10-19 2:01

据我所知,在plugins_loaded中添加一个钩子对零进行了改进,并且不是最佳实践,因为没有任何改进,如果有的话,增加了内存使用量,降低了速度,因为它必须执行一项操作而不是刚刚添加的操作。同样,使用OO不应被视为最佳实践。

– Backie
2011-2-16在10:46

@IanDunn:如果您想要PHP4支持,但是自4年前的2008年以来,PHP4的支持就被取消了。没有理由仍然使用特定于PHP4的检查。

–沙哑
2012年8月29日13:42

#10 楼

停用不应引起数据丢失
停用后插件不应删除其任何数据。
相关

卸载应删除所有插件的数据


#11 楼

仅包含您需要的文件...

如果您位于前端,请不要包含与管理区域相关的代码。

#12 楼

在卸载插件时宣布数据丢失
卸载后,插件应提示用户它将删除其数据,并在此之前收到用户可以删除数据的确认,并且插件也应允许用户卸载后保留数据的选项。 (来自@EAMann的想法)。
相关

卸载应删除所有插件的数据
停用不应引起数据丢失


评论


WordPress本身会在管理员中显示警告消息,这种情况会发生(至少现在在中继中)。

– hakre
2010年8月24日在9:06

除了WordPress显示的警告消息外,该插件无法提示用户,因为在卸载时该插件已被停用。但请参阅票证#20578。

– J.D.
2015年3月20日13:00

#13 楼

让插件的文件夹名称更改

/ plugins / pluginname / {various}

用于该文件夹的“ pluginname”应始终可更改。

这通常是通过定义常量并在插件中始终使用它们来处理的。

不用说许多流行的插件都是罪人。

相关:



plugins_url(),可轻松链接到包含在插件中的资源。


评论


重命名插件的文件夹将导致自动更新中断,因此我不确定这是最好的做法。

– mtekk
2011年1月14日下午5:53

无论如何,您都必须在进行更改后重新启用插件(名称更改可能会导致插件停用),这时WP将重新创建或更新与插件相关的相应数据库条目(因此不会根本无法更新)。

– t31os
2011-2-17在18:34



可以使用plugin_basename(__ FILE__)代替插件来确定插件的本地名称。这对于具有相同插件的副本(测试,其他位置的多个帐户,但每个插件仅一个帐户,...)也很有用。

–拉斐尔
2011年3月11日22:23

#14 楼

使用WordPress(内置)错误处理

如果某些用户输入有误,不仅要return;。向他们提供有关错误的信息。

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}



所有人都遇到一个错误(对象)

您可以设置引导过程中主题或插件的全局错误对象:

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

以后您可以按需添加无限错误:

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}


然后您可以在主题末尾全部获取它们。这样,您就不会中断呈现页面,并且仍然可以输出所有错误以进行开发

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );



您可以在此问题中找到更多信息。修复了WP_Errorwp_die()的“协同工作”的相关故障单,随后将出现另一故障单。评论,评论家等受到赞赏。

评论


如果仅访问WP_Error对象的属性而从未将实例作为对象传递,为什么要实例化WP_Error对象?

– ProfK
2011-10-28 6:03

@ProfK我将其改写得更短,标题/内容为wp_die();。是错误的(反向)。关于您的Q)我不完全理解。设置WP_Error类的实例时,您可以通过诸如get_error_code();、 get_error_message();、 get_error_data();之类的函数完全访问其数据。和复数形式。您也只能在主题或插件的引导程序中实例化一次,只需使用$ error-> add();即可。填充其他错误,最后用$ error-> get_error_messages()将其输出到页脚中;抓住他们。

– kaiser
11-10-28在11:01

@ProfK我将在此问题上发布将来的更新。我目前正在检查wp错误类的行为,并想编写有关公共主题错误API(已完成草稿)的票证。您会在Q的底部找到另一个票证的链接,该票证使WP_Error和wp_die()更加紧密(已经有补丁)。任何评论,建议,批评者和其他意见都将受到高度赞赏。

– kaiser
2011年10月28日18:00

#15 楼

最小化添加到全局命名空间中的名称
插件应通过最小化添加到全局命名空间中的名称数量来尽可能减少其影响。
这可以通过将插件的函数封装到一个类中来实现。或使用PHP名称空间功能。给所有内容加上前缀也可以帮助,但不够灵活。
在函数和类旁边,插件不应引入全局变量。使用类通常会使它们过时,并简化了插件维护。
相关

适当地前缀


评论


您能否将“不应引入全局变量”移到它自己的答案上?这是与这个问题分开的,实际上是我想辩论的一个问题(两者都是因为我认为我可能不同意特殊情况,因为我想从别人的观点中学习)。

– MikeSchinkel
2010年8月25日19:57



#16 楼

使用PhpDoc进行注释
最佳实践接近于PhpDoc样式。
如果您不使用像“ Eclipse”这样的IDE,则可以看一下PhpDoc手册。不必确切知道它是如何工作的。专业开发人员无论如何都可以阅读代码,并且只需要摘要即可。业余编码人员和用户可能会喜欢您在相同知识水平上进行解释的方式。

#17 楼

在add_option
之前使用Settings API

与其通过add_option函数向数据库添加选项,不如将其存储为数组,而应使用Settings API来为您处理所有事情。

在add_option之前使用Theme ModificationsAPI。ModificationsAPI是一种非常简单的构造,并且是一种允许添加和检索选项的安全方法。一切都保存为序列化值在数据库中。简单,安全,简单。

评论


而且,使用update_option而不要使用add_option,当不存在该选项时,更新函数将创建该选项。

– t31os
2011-02-17 18:32

我不会说永远不要使用add_option。 add_option有一个很好的用例,如果该选项已经设置,则不会更改,因此我在激活时使用它来保留可能已经存在的用户首选项。

– ProfK
2011-10-28 5:47

add_option的另一个用例是要显式禁用自动加载时。 update_option将强制自动加载为true,因此您要禁用自动加载,请在最初创建选项时使用add_option。

–戴夫·罗姆西
2012年7月26日5:24



#18 楼

保护插件用户隐私

(以前是:匿名API通信)

如果插件与外部系统或API(例如某些Web服务)进行通信,则应匿名进行通信或为用户提供匿名选项,以确保没有与插件用户相关的数据泄露给不受控制的第二方。

#19 楼

WordPress.org上的主机插件
使用WordPress.org上提供的SVN存储库托管插件。它使更新用户体验更加容易,并且如果您以前从未使用过SVN,则可以通过在有理由的上下文中使用它来真正理解。

#20 楼

通过使用权限提供访问控制
在很多情况下,用户可能不希望每个人都可以访问由您的插件创建的区域,尤其是对于执行多个复杂操作的插件而言,仅进行一次硬编码功能检查可能是不够的。
至少要对您的插件可以用于的所有不同类型的过程进行适当的功能检查。

#21 楼

导入/导出插件设置
在各个插件中并不常见,但是如果您的插件具有(某些)设置,它应该提供数据的导入/导出,如配置和用户输入。
导入/导出可提高可用性
具有这样的导入和导出功能(以及撤消机制)的示例插件是Breadcrumb NavXT(Wordpress插件)(完整披露:我在其中写了一些小代码,大部分是
相关

卸载应删除所有插件的数据
停用不应引起数据丢失


#22 楼

整理代码
总是很难读取未按执行顺序编写的代码。首先包括/要求,定义,wp_enqueue_style和_script等,然后是插件/主题所需的功能,最后是构建器(例如管理屏幕,集成在主题中的内容等)。
尝试将css和js之类的内容分隔在自己的文件夹中。还要尝试使用仅作为辅助函数的函数,例如数组展平器等。保持“主”文件尽可能整洁和易于阅读的方式,可以帮助用户,开发人员和您,当您尝试在一年内进行更新并且很长时间都没有看到代码时。
经常重复的结构也很不错,因此您始终可以找到自己的方式。在不同的项目上以已知的结构进行开发将使您有时间进行改进,即使您的客户切换到其他开发人员,您也永远不会听到“他留下了混乱”的声音。这可以建立您的声誉,应该是一个长期目标。

评论


我担心这会引起人们的争论,而不是让所有受尊敬的人都同意的客观最佳实践。非常重要的一点是,我们仅解决客观的最佳实践,以便人们愿意同意“保佑”清单,而不是提出有争议的条款,无论其含义如何。

– MikeSchinkel
2010年8月26日在6:55

#23 楼

具有风格的模具

以体面的方式死亡
所有插件(甚至主题)功能都应在关键位置使用wp_die(),以向用户提供有关发生的情况的一些信息。 php错误很烦人,wp_die可以向用户提供有关插件(或插件)做错了什么的漂亮信息。另外,如果用户禁用了调试功能,则插件会中断。

使用wp_die()还可以帮助您使插件/主题与wordpress testsuite兼容。

相关:


使用WP错误处理


#24 楼

为用户提供帮助屏幕
说RTFM(单击帮助)作为答案要比一次又一次地回答问题更好。
/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

更新/注意:(请参阅注释kaiser):以上示例将在类中使用

评论


应该在每个人的工具箱中(只要您必须说明特定的管理ui屏幕)。 +1

– kaiser
2011-02-18 14:58

顺便说一句:您应该提到,这是要驻留在一个类中,以及如何与$ this-> _ page_id交互以及如果您从functions.php或不带类的插件文件中添加动作钩子,该怎么办? 。

– kaiser
2011-2-18在16:07

#25 楼

提供可扩展的表格
当插件提供输入数据的可能性时,它应该始终在“提交”和/或“重置”按钮之前的末尾有一个钩子,因此开发人员可以轻松地扩展表单而不必仅字段,但也有按钮。
请参阅:设置API
相关

使用动作和过滤器
重新使用现有功能
I18n支持


#26 楼



不总是直接通过Hook来包含函数。

示例:


不要通过不带钩子的新函数来包含插件的类

使用Hook plugins_loaded

// add the class to WP                                   
function my_plugin_start() {                                                               
    new my_plugin();   
}                                                        
add_action( 'plugins_loaded', 'my_plugin_start' );



更新:
一个小例子:Plugin-svn-trunk-page
和一个伪示例

//avoid direct calls to this file where wp core files not present
if (!function_exists ('add_action')) {
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit();
}

if ( !class_exists( 'plugin_class' ) ) {
    class plugin_class {

        function __construct() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists


您还可以通过在多站点安装上通过mu_plugins_loaded进行加载,请参阅法典以获取操作参考:http://codex.wordpress.org/Plugin_API/ Action_Reference
您还可以在这里看到该钩子如何包含wP:http://adambrown.info/p/wp_hooks/hook/plugins_loaded?version=2.1&file=wp-settings.php
我使用这通常并不困难,而且还不如早期,要好于辛苦的new class();

评论


@bueltige ---您能再解释一下吗

– NetConstructor.com
2011-2-13在1:06

一个小例子:[Plugin-svn-trunk-page]svn.wp-plugins.org/filter-rewrite-rules/trunk/…和一个伪例子//避免直接调用该文件,如果不存在wp核心文件(!function_exists('add_action')){header('Status:403 Forbidden'); header('HTTP / 1.1 403 Forbidden');出口(); } if(!class_exists('plugin_class')){类plugin_class {函数__construct(){}} // //结束类函数plugin_start(){new plugin_class(); } add_action('plugins_loaded','plugin_start'); } //结束class_exists

– Bueltge
2011-2-14在21:11



@ Netconstructor.co-我已经更新了线程,代码评论很丑

– Bueltge
2011-2-14在21:14

#27 楼

使用GPL兼容许可证的许可证插件
插件和主题应使用WordPress兼容许可证进行许可。这使它们可以与WordPress作为“程序”一起重新分发。推荐的许可证是GPL。请注意,该插件随附的所有代码库都必须与同一许可证兼容。
(过去和现在,这一直是一个问题,也是辩论的重点。)

评论


让我们暂时保留GPL兼容性:core.trac.wordpress.org/ticket/14685

– hakre
2010年8月25日在20:13

#28 楼

您的插件说明应准确详细说明插件的功能。有10个精选的帖子插件。它们都显示特色帖子,但是许多具有不同的功能。通过阅读说明,将您的插件与类似插件进行比较应该很容易。您应该在说明中包括有用的链接,例如指向设置的链接。

#29 楼

最大限度地减少远程数据源和Web服务的副作用

如果使用插件,则插件应通过缓存/数据提供者层对Webservice和/或XMLRPC / SOAP请求进行缓存/屏蔽,以便不进行前期请求等待(缓慢的)Web服务响应。

包括下载RSS feed和其他页面。设计可以在后台请求数据的插件。

一个可能的步骤是(以发布到ping.fm为例):
创建一个缓冲表,比如说:
ping_fm_buffer_post(
日期,时间,消息,已提交的时间,状态



每次要将更新提交给ping.fm时,请将其添加到此表中。
现在,我们需要创建一个插件来处理这些数据。该插件将通过crontab运行,以检查尚未提交的每个更新
,因为我们有了此表,所以我们还可以列出提交给ping.fm的每条消息并检查每条帖子的状态。万一在ping.fm方面出现问题,我们可以重新提交。


评论


我真的不明白你到底要去哪里。您可以提供一些支持材料的链接吗?

– MikeSchinkel
10年8月25日在19:39

另外,我不确定“净开销”是多少。有没有更好的名词?如果更清楚,那将是一个更好的客观规则。而“预防”是不可能的;而“最小化”则是?

– MikeSchinkel
2010年8月25日在20:03



你也许是对的。措辞不当和防止是永远不可能的,最大程度地减少匹配。

– hakre
2010年8月25日在20:05

#30 楼

测试您的插件
我们绝对应该在我们的插件开发环境中使用一些测试工具。
基于Ethan Seifert对测试问题的回答,这些是可以遵循的良好做法:

您的单元测试应该测试类可以执行的最少行为。
当您达到功能测试级别时,可以在此处使用Wordpress依赖项来测试代码。
取决于什么您的插件确实可以-考虑使用基于Selenium的测试,该测试通过使用ID来测试DOM中数据的存在性


评论


尽管测试很重要,但说单元测试应该测试最小的而不是最大的测试似乎是不明智的。如果您在测试与WordPress有关的问题方面遇到困难,然后深入WordPress核心,则会发现一大堆内部全局变量,可用于查看项目是否有效。

– Backie
2011-2-16在10:51

但是,涵盖最小的第一个是基本的,因此您可以按照答案所述使用WordPress进行功能测试,不是吗?

–费尔南多·布里安诺(Fernando Briano)
2011-2-17的3:55

这是不是应用程序的插件,您可以在没有Java运行时的情况下测试Java应用程序吗?是的,通过将Java编写为模型,然后测试您的插件。这些错误可能在您的模型中。 *)免责声明或将其编译为本机代码。

– edelwater
2011-2-18在1:18