本文概述
- 常见错误1:停止调试
- 常见错误2:使用wp_head挂钩添加脚本和样式
- 常见错误3:避免使用儿童主题并修改WordPress核心文件
- 常见错误4:硬编码值
- 常见错误5:不会阻止你的网站被编入索引
- 常见错误6:不检查插件是否处于活动状态
- 常见错误7:加载太多资源
- 常见错误8:保留管理栏
- 常见错误9:不使用GetText筛选器
- 常见错误10:保留默认的永久链接
- 总结
我们只是人类, 而成为人类的特征之一就是我们犯错。另一方面, 我们也在自我纠正, 这意味着我们倾向于从错误中学习, 并希望能够避免两次犯相同的错误。我在WordPress领域犯的许多错误都源于在实施解决方案时试图节省时间。但是, 当这种方法导致问题加剧时, 这些人通常会抬起头来。犯错误是不可避免的。但是, 从别人的监督中学习(当然是你自己的!)是你应该积极采取的道路。
工程师看起来像超级英雄, 但我们仍然是人类。向我们学习。
鸣叫
常见错误1:停止调试
为什么我的代码可以正常工作, 为什么还要使用调试?调试是WordPress内置的一项功能, 它将导致显示所有PHP错误, 警告和通知(关于不推荐使用的功能等)。关闭调试功能后, 可能会生成一些我们从未见过的重要警告或通知, 但如果我们不及时处理, 可能会在以后引起问题。我们希望我们的代码能够与我们网站的所有其他元素完美配合。因此, 在将任何新的自定义代码添加到WordPress时, 应始终在调试打开的情况下进行开发工作(但请确保在将站点部署到生产环境之前将其关闭!)。
要启用此功能, 你需要在WordPress安装的根目录中编辑wp-config.php文件。这是一个典型文件的片段:
// Enable debugging
define('WP_DEBUG', true);
// Log all errors to a text file located at /wp-content/debug.log
define('WP_DEBUG_LOG', true);
// Don’t display error messages write them to the log file /wp-content/debug.log
define('WP_DEBUG_DISPLAY', false);
// Ensure all PHP errors are written to the log file and not displayed on screen
@ini_set('display_errors', 0);
这不是可以使用的配置选项的详尽列表, 但是此建议的设置应该足以满足大多数调试需求。
常见错误2:使用wp_head挂钩添加脚本和样式
将脚本添加到标题模板有什么问题? WordPress已经包含了大量流行脚本。尽管如此, 许多开发人员仍将使用wp_head挂钩添加其他脚本。这可能会导致相同的脚本, 但版本不同, 被多次加载。
进入队列即可进行救援, 这是WordPress友好的向网站添加脚本和样式的方式。我们使用排队来防止插件冲突并处理脚本可能具有的任何依赖关系。这可以通过使用内置函数wp_enqueue_script或wp_enqueue_style分别使脚本和样式入队来实现。这两个函数之间的主要区别在于, 使用wp_enqueue_script我们有一个附加参数, 该参数使我们可以将脚本移至页面的页脚。
wp_register_script( $handle, $src, $deps = array(), $ver = false, $in_footer = false )
wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false )
wp_register_style( $handle, $src, $deps = array(), $ver = false, $media = 'all' )
wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all' )
如果不需要脚本来呈现折叠上方的内容, 我们可以安全地将其移至页脚, 以确保折叠上方的内容快速加载。优良作法是先注册脚本, 然后再入队, 因为这允许其他人通过自己插件中的句柄注销脚本, 而无需修改插件的核心代码。除此之外, 如果已入队的另一个脚本的依存关系数组中列出了已注册脚本的句柄, 则该脚本将在加载该突出显示的入队脚本之前自动加载。
常见错误3:避免使用儿童主题并修改WordPress核心文件
如果计划修改主题, 请始终创建一个子主题。一些开发人员将对父主题文件进行更改, 只是在升级主题后发现其更改已被覆盖并永久丢失。
要创建子主题, 请将style.css文件放置在子主题文件夹的子目录中, 内容如下:
/*
Theme Name: Twenty Sixteen Child
Theme URI: http://example.com/twenty-fifteen-child/
Description: Twenty Fifteen Child Theme
Author: John Doe
Author URI: http://example.com
Template: twentysixteen
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: light, dark, two-columns, right-sidebar, responsive-layout, accessibility-ready
Text Domain: twenty-sixteen-child
*/
上面的示例基于默认的WordPress主题二十一创建了一个子主题。该代码最重要的一行是包含单词” Template”的代码, 该单词必须与你要克隆其子级的父主题的目录名称匹配。
相同的原则也适用于WordPress核心文件:不要通过修改核心文件走简单的路。通过采用WordPress可插拔功能和过滤器来进行额外的工作, 以防止你的更改在WordPress升级后被覆盖。可插拔功能使你可以覆盖某些核心功能, 但是这种方法正在逐步淘汰, 并由过滤器代替。过滤器达到相同的最终结果, 并插入WordPress函数的末尾以允许修改其输出。使用可插拔函数时, 总是有一个诀窍是用if(!function_exists())来包装函数, 因为如果多个插件试图在没有此包装器的情况下覆盖同一个可插拔函数, 则会产生致命错误。
常见错误4:硬编码值
通常, 在代码中的某个位置硬编码一个值(例如URL)看起来更快, 但是在调试和纠正由此引起的问题上花费的时间却要大得多。通过使用相应的函数动态生成所需的输出, 我们极大地简化了代码的后续维护和调试。例如, 如果你使用硬编码的URL将网站从测试环境迁移到生产环境, 突然之间你会发现你的网站无法正常工作。这就是为什么我们应该使用下面列出的函数来生成文件路径和链接的原因:
// Get child theme directory uri
stylesheet_directory_uri();
// Get parent theme directory
get_template_directory_uri();
// Retrieves url for the current site
site_url();
硬编码的另一个不好的例子是编写自定义查询时。例如, 作为一项安全措施, 我们将默认的WordPress数据表前缀从wp_更改为更独特的名称, 例如wp743_。如果我们移动WordPress安装, 我们的查询将失败, 因为表前缀可以在环境之间更改。为了防止这种情况的发生, 我们可以引用wpdb类的表属性:
global $wpdb;
$user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
请注意, 我不是在表名中使用值wp_users, 而是在让WordPress解决问题。使用这些属性生成表名将有助于确保我们返回正确的结果。
常见错误5:不会阻止你的网站被编入索引
为什么我不希望搜索引擎将我的网站编入索引?索引很好, 对吗?嗯, 在构建网站时, 你不希望搜索引擎在完成构建并建立永久链接结构之前将你的网站编入索引。此外, 如果你拥有用于测试网站升级的登台服务器, 则你不希望Google这样的搜索引擎将这些重复的页面编入索引。当存在多个无法区分的内容时, 搜索引擎很难确定哪个版本与搜索查询更相关。在这种情况下, 搜索引擎将对内容重复的网站进行处罚, 因此, 你的网站将在搜索排名中遭受损失。
如下所示, WordPress的”阅读设置”具有一个复选框, 其中显示”阻止搜索引擎为该网站建立索引”, 尽管在其下方确实有一个重要的注释, 指出”取决于搜索引擎来满足此请求”。
请记住, 搜索引擎通常不接受此请求。因此, 如果你要可靠地阻止搜索引擎将你的网站编入索引, 请编辑.htaccess文件并插入以下行:
Header set X-Robots-Tag "noindex, nofollow"
常见错误6:不检查插件是否处于活动状态
如果我的插件始终处于打开状态, 为什么还要检查是否存在插件功能?当然, 你的插件有99%的时间处于活动状态。但是, 由于某种原因停用了那1%的时间呢?如果发生这种情况, 你的网站可能会显示一些难看的PHP错误。为了防止这种情况, 我们可以在调用插件函数之前检查插件是否处于活动状态。如果插件功能是通过前端调用的, 则我们需要包含plugin.php库才能调用函数is_plugin_active():
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'plugin-folder/plugin-main-file.php' ) ) {
// Run plugin code
}
此技术通常非常可靠。但是, 在某些情况下, 作者可能更改了主插件目录名称。一个更健壮的方法是检查插件中是否存在类:
if( class_exists( ‘WooCommerce’ ) ) {
// The plugin WooCommerce is turned on
}
作者不太可能更改插件的类的名称, 因此我通常建议使用此方法。
常见错误7:加载太多资源
为什么我们要选择性地加载页面的插件资源?如果没有在用户导航到的页面上使用该插件, 则没有合理的理由为该插件加载样式和脚本。通过仅在必要时加载插件文件, 我们可以减少页面加载时间, 这将改善最终用户体验。以一个WooCommerce网站为例, 我们只希望将插件加载到我们的购物页面上。在这种情况下, 我们可以有选择地删除所有其他网站页面上正在加载的文件, 以减少膨胀。我们可以将以下代码添加到主题或插件的functions.php文件中:
function load_woo_scripts_styles(){
if( function_exists( 'is_woocommerce' ) ){
// Only load styles/scripts on Woocommerce pages
if(! is_woocommerce() && ! is_cart() && ! is_checkout() ) {
// Dequeue scripts.
wp_dequeue_script('woocommerce');
wp_dequeue_script('wc-add-to-cart');
wp_dequeue_script('wc-cart-fragments');
// Dequeue styles.
wp_dequeue_style('woocommerce-general');
wp_dequeue_style('woocommerce-layout');
wp_dequeue_style('woocommerce-smallscreen');
}
}
}
add_action( 'wp_enqueue_scripts', 'load_woo_scripts_styles');
可以使用wp_dequeue_script($ handle)函数通过注册脚本的句柄删除脚本。同样, wp_dequeue_style($ handle)将阻止加载样式表。但是, 如果这对于你实施来说具有挑战性, 则可以安装Plugin Organizer, 该插件可以根据某些条件(例如帖子类型或页面名称)选择性地加载插件。最好禁用所有可能已打开的缓存插件(例如W3Cache), 以防止你不得不不断刷新缓存以反映所做的任何更改。
常见错误8:保留管理栏
我不能只让所有人都看到WordPress管理栏吗?好吧, 是的, 你可以允许你的用户访问管理页面。但是, 这些页面通常不会在视觉上与你选择的主题进行集成, 并且无法提供无缝的集成。如果你希望网站看起来很专业, 则应禁用管理栏, 并提供自己的前端帐户管理页面:
add_action('after_setup_theme', 'remove_admin_bar');
function remove_admin_bar() {
if (!current_user_can('administrator') && !is_admin()) {
show_admin_bar(false);
}
}
上面的代码复制到主题的functions.php文件中后, 将仅为网站管理员显示管理栏。你可以将任何WordPress用户角色或功能添加到current_user_can($ capability)函数中, 以使用户无法查看管理栏。
常见错误9:不使用GetText筛选器
我可以使用CSS或JavaScript更改按钮的标签, 这是怎么回事?好吧, 可以。但是, 当你可以使用WordPress中最方便的过滤器之一(称为gettext)时, 会增加多余的代码和额外的时间来呈现按钮。结合插件的textdomain(可确保WordPress区分所有加载的翻译的唯一标识符)相结合, 我们可以使用gettext过滤器在呈现页面之前修改文本。如果你在源代码中搜索函数load_plugin_textdomain($ domain), 它将为你提供我们需要覆盖相关文本的域名。任何信誉良好的插件都将确保在插件初始化时设置插件的textdomain。如果你要更改主题中的某些文本, 请搜索load_theme_textdomain($ domain)代码行。再次以WooCommerce为例, 我们可以更改”相关产品”标题上显示的文本。将以下代码插入主题的functions.php文件中:
function translate_string( $translated_text, $untranslated_text, $domain ) {
if ( $translated_text == 'Related Products') {
$translated_text = __( 'Other Great Products', 'woocommerce' );
}
return $translated_text;
}
add_filter( 'gettext', 'translate_string', 15, 3 );
只要通过上述功能设置了textdomain, 此过滤器钩子就会通过国际化函数__()和_e()应用于翻译后的文本。
_e( 'Related Products', 'woocommerce' );
在插件中搜索这些国际化功能, 以查看可以自定义的其他字符串。
常见错误10:保留默认的永久链接
默认情况下, WordPress使用带有帖子ID的查询字符串返回指定的内容。但是, 这不是用户友好的, 用户在复制URL时可能会删除URL的相关部分。更重要的是, 这些默认的永久链接不使用搜索引擎友好的结构。启用所谓的”漂亮”永久链接将确保我们的URL包含帖子标题中的相关关键字, 以提高搜索引擎排名的效果。必须追溯修改永久链接, 这可能是一项艰巨的任务, 尤其是如果你的网站已经运行了相当长的一段时间, 并且你已经被搜索引擎索引了数百篇文章。因此, 在安装WordPress之后, 请确保立即将永久链接结构更改为对搜索引擎更友好的内容, 而不仅仅是帖子ID。我通常在我建立的大多数站点中使用帖子名称, 但是你可以使用可用的永久链接结构标记将永久链接自定义为所需的任何格式。
总结
本文绝不是WordPress开发人员所犯错误的详尽列表。不过, 如果你需要从本文中删除一件事, 那就是永远不要使用快捷方式(而且在任何开发平台中都是如此, 而不仅仅是WordPress!)。现在由于不良的编程习惯而节省的时间将在以后困扰你。随时在下面留下评论, 与我们分享你过去犯的一些错误, 更重要的是, 你可以汲取任何教训。
相关:我的五个最差的WordPress开发错误