WordPress 开发人员最常犯的 10 个错误

已发表: 2022-03-11

我们只是人类,而人类的特征之一就是我们会犯错误。 另一方面,我们也在自我纠正,这意味着我们倾向于从错误中吸取教训,并希望因此能够避免两次犯同样的错误。 我在 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 Hook 添加脚本和样式

将脚本添加到我的标题模板有什么问题? WordPress 已经包含大量流行的脚本。 尽管如此,许多开发人员仍会使用wp_head挂钩添加其他脚本。 这可能导致多次加载相同的脚本,但版本不同。

在这里排队可以拯救,这是向我们的网站添加脚本和样式的 WordPress 友好方式。 我们使用入队来防止插件冲突并处理脚本可能具有的任何依赖项。 这是通过使用内置函数wp_enqueue_scriptwp_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 主题Twenty Sixteen创建了一个子主题。 这段代码中最重要的一行是包含单词“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 阅读设置有一个复选框,上面写着“阻止搜索引擎索引该站点”,尽管它下面确实有一个重要的注意事项,说明“由搜索引擎来支持这个请求”。

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)将阻止加载样式表。 但是,如果这对您来说太难实现,您可以安装插件管理器,它提供了根据某些条件(例如帖子类型或页面名称)有选择地加载插件的能力。 禁用任何缓存插件(如 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 中!)。 现在通过糟糕的编程实践节省的时间将在以后再次困扰您。 欢迎在下方发表评论,与我们分享您过去犯下的一些错误——更重要的是,从中吸取教训。

相关:我的五个最糟糕的 WordPress 开发错误