插件开发的客观最佳实践?[关闭]


135

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

想法是就可能的客观最佳实践进行协作,以便我们最终可以在某些社区协作审核过程中使用它们。

更新:在看到前几个回答后,很明显,我们每个答案只需要一个想法/建议/最佳实践,人们应该查看列表以确保发布前没有重复。


我真的不明白社区Wiki应该如何在SE(以及其他)上正确地使用SE,但是也许这是关于meta的问题。它只会在答案中堆积大多数的骗子。
hakre 2010年

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

Answers:


72

使用动作和过滤器

如果您认为人们想添加或更改一些数据,请在返回之前提供apply_filters()

PS一件事,我感到有些失望,您要解决的问题是只为最终用户设计的插件所占的百分比,即没有自己的挂钩。想象一下WordPress是否像大多数插件一样设计?这将是不灵活且非常利基的解决方案。

如果WordPress能够自动安装其他插件所依赖的插件,也许情况会有所不同?因为通常情况下,我通常必须从头开始编写很多我需要的功能,因为客户需要某种方式的东西和可用的插件,尽管那里有90%的客户,但我却没有灵活性来更新剩余的10%。

我确实希望那些领导WordPress社区的人能找到一种方法,以确保对插件的遵循最佳实践(例如为其他开发人员添加钩子)得到奖励,就像在StackExchange网站上获得好的答案一样。

让我们以另一个问题为例:

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

有关


55

使用wp_enqueue_script和加载脚本/ CSSwp_enqueue_style

插件不应加载/尝试加载JS / CSS文件的重复版本,尤其是jQuery和WP Core中包含的其他JS文件。

链接JS和CSS文件时,插件应始终使用wp_enqueue_scriptwp_enqueue_style并且永远不要直接通过<script>标签使用。

有关


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

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

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

49

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 / plugins / my-plugin / languages / my- plugin-zh_CN.mo

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

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


以下是旧方法(自WP 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年

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

48

确保插件使用WP_DEBUG不会产生任何错误

始终在WP_DEBUG打开状态下测试您的插件,理想情况下,在整个开发过程中都要打开它。插件不应WP_DEBUG在上引发任何错误。这包括不建议使用的通知和未检查的索引。

要打开调试,请编辑wp-config.php文件,以便将WP_DEBUG常量设置为true。有关更多详细信息,请参见“ Debugx on Debug ”。


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

好没问题。对于那个很抱歉。
约翰·布洛赫

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

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

42

WordPress核心中的首次使用现有功能

如果可以:使用WordPress核心中包含的现有功能,而不是编写自己的功能。仅当WordPress核心中没有适当的预先存在的函数时,才开发自定义PHP函数。

好处之一是您可以使用“日志弃用的通知”轻松监视应替换的功能。另一个好处是,即使他们不是经验丰富的PHP开发人员,用户也可以查看Codex中的功能文档并更好地了解该插件的功能。

有关


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

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

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

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

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

35

卸载应删除所有插件数据

从WordPress安装中删除后插件应删除其创建的所有文件,文件夹,数据库条目和表以及所创建的选项值

插件可以提供导出/导入设置的选项,以便可以在删除之前将设置保存在WordPress之外。

有关


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

1
我只说的是什么时候完全删除插件,而不是什么时候停用插件。
特拉维斯·诺斯卡特

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

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

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

34

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

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

请参阅:格式化SQL语句


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


31

使用面向类和对象的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年

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

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

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

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



21

宣布有关卸载插件的数据丢失

在卸载插件应该 提示,这将是删除它的数据的用户,并收到确认用户是好有这样和插件之前删除的数据应该允许用户以保持数据的选项后卸载。(这个想法来自@EAMann。)

有关


3
WordPress本身会在管理员中显示一条警告消息,表明这种情况发生了(至少现在在主干中)。
hakre

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

19

更改插件的文件夹名称

/ plugins / pluginname / {various}

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

这通常是通过定义常量并在整个插件中一致地使用它们来处理的。

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

有关:

  • plugins_url() 以便轻松链接到包含在插件中的资源。

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

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

除了使用常量之外,还可以使用plugin_basename(__FILE__)该插件的本地名称。这对于具有相同插件的副本(测试,其他位置的多个帐户,但每个插件仅一个帐户,...)也很有用。
拉斐尔

19

使用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' );

您可以在此Q上找到更多信息。一个相关的票证用于修复的“一起工作” WP_Errorwp_die()从那里链接,随后将有另一个票证。评论,评论家等。


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

@ProfK我将其改写得更短一些,标题/内容wp_die();错误(反向)。关于您的Q)我不完全理解。当您设置WP_Error类的实例,你必须通过类似功能的全面访问其数据get_error_code();get_error_message();get_error_data();和多个版本。您也只能在主题或插件的引导程序中实例化一次,并仅用于$error->add();填充其他错误,最后将其输出到页脚中$error->get_error_messages();以捕获所有错误。
kaiser

@ProfK我将在此Q上发布将来的更新。我目前正在检查wp错误类的行为,并希望编写有关公共主题错误API(已完成草稿)的票证。你会发现一个链接到另一张机票带来WP_Errorwp_die()更紧密(已经有一个补丁)在Q.任何意见,建议,批评的底部,否则表示高度赞赏。
kaiser

18

最小化添加到全局命名空间的名称

插件 通过最大程度地减少其添加到全局名称空间中的名称的数量来减少其影响

这可以通过将插件的功能封装到一个类中或使用PHP名称空间功能来完成。给所有内容加上前缀也有帮助,但不够灵活。

在函数和类旁边,插件不应引入全局变量。使用类通常会使它们过时,并简化了插件维护。

有关


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

17

使用PhpDoc进行评论

最佳实践接近PhpDoc样式。如果您不使用“ Eclipse”之类的IDE,则只需看一看PhpDoc手册

您不必确切了解其工作原理。专业开发人员无论如何都可以阅读代码,并且只需要摘要即可。业余编码人员和用户可能会喜欢您在相同知识水平上进行解释的方式。


17

在add_option之前使用Settings API

与其通过add_option函数向数据库添加选项,不如使用设置API来将它们存储为数组,该API可以为您处理所有事情。

在add_option之前使用主题修改API

修改API是一个非常简单的结构,并且允许添加和检索选项的安全方法。一切都保存为序列化值在您的数据库中。简单,安全和简单。


1
而且,使用update_optionand never时add_option,更新功能将在不存在该选项时创建该选项。:)
t31os 2011年

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

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

16

保护插件用户隐私

(以前:匿名API通信)

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


15

WordPress.org上的主机插件

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


15

使用权限提供访问控制

在许多情况下,用户可能不希望每个人都可以访问您的插件创建的区域,尤其是对于执行多个复杂操作的插件而言,仅进行一次硬编码功能检查可能不够。

至少要对插件可以使用的所有不同类型的过程进行适当的功能检查。


12

导入/导出插件设置

这在各个插件之间并不常见,但是如果您的插件具有(某些)设置,则应 提供导入/导出数据,例如配置和用户输入

导入/导出提高了插件的可用性。

一个具有这种导入和导出功能(以及撤消机制)的示例插件Breadcrumb NavXT(Wordpress插件)(完整披露:我在那里写了一些小代码,大部分是mtekk完成的)。

有关


12

整理您的代码

始终很难读取未按执行顺序编写的代码。首先包括/要求,定义,wp_enqueue_style和_script等,然后是插件/主题所需的功能,最后是构建器(例如管理屏幕,集成在主题中的内容等)。

尝试将css和js之类的内容放在自己的文件夹中。还要尝试使用仅作为辅助函数的函数,例如数组展平器和类似函数。保持“主”文件尽可能整洁和易于阅读是一种可以帮助用户,开发人员和您的方法,当您尝试在一年内进行更新并且很长时间没有看到代码时。

经常重复的结构也很不错,因此您始终可以找到自己的方式。在不同的项目上以已知的结构进行开发将使您有时间进行改进,即使您的客户切换到其他开发人员,您也永远不会听到“他留下了混乱”的声音。这可以建立您的声誉,应该是一个长期目标。


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

11

死于风格

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

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

有关:

11

为用户提供帮助屏幕

说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

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


9

总是通过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 另外这里,你看,怎么用这个钩子inlcude WP:HTTP:// adambrown。 info / p / wp_hooks / hook / plugins_loaded?version = 2.1&file = wp-settings.php 我经常使用它,并且不那么困难和早期,比使用new new class()更好。


@bueltige ---您能再解释一下吗
NetConstructor.com 2011年

3
一个小例子:[Plugin-svn-trunk-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/… 和一个伪示例 //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
bueltge 2011年

2
@ Netconstructor.co-我已更新线程,代码评论很丑
bueltge 2011年


8

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

除非您的插件非常基础,否则您应该避免吹牛。您应该在说明中包括有用的链接,例如指向设置的链接。


7

最小化远程数据源和Web服务的副作用

如果使用插件,则插件 通过缓存/数据提供者层缓存/屏蔽Webservice和/或XMLRPC / SOAP请求,以免使前端请求等待(慢速)webservice响应。

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

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

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

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

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

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

7

测试您的插件

我们绝对应该在我们的插件开发环境中拥有一些测试工具。

基于此答案伊桑·塞弗特到测试的问题,这些都是很好的做法如下:

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

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

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

1
这是不是应用程序的插件,您可以在没有Java运行时的情况下测试Java应用程序吗?是的,通过将Java编写为模型然后测试您的插件。错误很可能在您的模型中。*)免责声明或将其编译为本机代码。
edelwater 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.