作为 WordPress 用户已有一段时间,我一直想创建一个 WordPress 插件,但我犹豫了。我没有遇到找不到现有插件的问题,而且维护 WordPress 插件的想法似乎令人生畏,因为我只在这个博客中使用 WordPress。然而,通过在我的重新设计中添加一个功能,我找到了完美的用例:防止在主页上显示给定类别中的帖子。我已经详细介绍了用于防止主页中某个类别的帖子的 PHP 代码段,但这仅适用于托管 functions.php 文件的主题。通过创建从主页插件中删除类别中的帖子,此功能现在适用于所有主题!
设置
目标是确保插件尽可能轻量和简单。其他目标包括:
- 将所有插件代码包含在一个文件中
- 仅使用一条数据库记录;为此,我们将保留一系列类别,这些类别应该被阻止访问主页
- 允许在“添加类别”和“编辑类别”页面上切换此选项
由于 WordPress 出色的插件 API,实现这些目标变得简单。
PHP
我将逐步解释 PHP 代码。我们首先定义一些重要的变量:
$RCFH_LOOP_LABEL = 'Remove from main loop'; $RCFH_LOOP_DESCRIPTION = 'Check this box if you would like posts in this category to be prevented from displaying within the main loop.'; $RCFH_LOOP_OPTION_KEY = 'remove-loop-cats';
前两个变量将用于“添加类别”和“编辑类别”表单,而最后一个变量代表我们将用于设置和获取数据库中类别的选项名称。接下来我们向“编辑类别”屏幕添加一个复选框:
<?php // Add the extra field to the EDIT category page add_action('category_edit_form_fields', 'rcfh_loop_field_edit'); function rcfh_loop_field_edit($term) { global $RCFH_LOOP_LABEL, $RCFH_LOOP_DESCRIPTION, $RCFH_LOOP_OPTION_KEY; $value = get_option($RCFH_LOOP_OPTION_KEY); if(!$value) { $value = array(); } $checked = in_array($term->term_id, $value); ?> <tr > <th scope="row" valign="top"><label for="removeMainLoop"><?php _e($RCFH_LOOP_LABEL); ?></label></th> <td> <input type="checkbox" name="remove-loop" id="removeMainLoop"<?php echo $checked ? ' checked="checked"' : ''; ?> value="1" /><br /> <span ><?php _e($RCFH_LOOP_DESCRIPTION); ?></span> </td> </tr> <?php } ?>
在 category_edit_form_fields 操作期间执行的 cl_loop_field_edit 函数检索选项值并检查给定的类别 ID 是否在不应显示在主页上的类别列表中 – 如果是,则选中该复选框.
下一步是将相同的表单字段添加到“添加类别”屏幕:
<?php // Add the extra field to the ADD category page add_action('category_add_form_fields', 'rcfh_loop_field_create'); function rcfh_loop_field_create() { global $RCFH_LOOP_LABEL, $RCFH_LOOP_DESCRIPTION; ?> <div > <label for="removeMainLoop"><?php _e($RCFH_LOOP_LABEL); ?></label> <input type="checkbox" name="remove-loop" id="removeMainLoop" value="1" /> <p><?php _e($RCFH_LOOP_DESCRIPTION); ?></p> </div> <?php } ?>
将复选框添加到两个表单后,下一步是创建一个函数,在添加和编辑事务期间保存复选框的值。该函数名为 cl_save_loop_value,将在 edit_category 和 create_category 操作期间执行:
// Add action for saving extra category information add_action('edit_category', 'rcfh_save_loop_value'); add_action('create_category', 'rcfh_save_loop_value'); function rcfh_save_loop_value($id) { global $RCFH_LOOP_OPTION_KEY; $value = get_option($RCFH_LOOP_OPTION_KEY); if(!$value) { $value = array(); } // Add or remove the value if(isset($_POST['remove-loop'])) { array_push($value, $id); } else { $value = array_diff($value, array($id)); } // Ensure no duplicates, just for cleanliness $value = array_unique(array_values($value)); // Save update_option($RCFH_LOOP_OPTION_KEY, $value); }
您会注意到最后进行了一些清理,以确保数组中没有重复的类别键。还知道 WordPress 在将数组放入数据库之前会对其进行序列化。最后一步是创建一个 pre_get_posts 操作函数,以防止所选类别中的帖子显示在主循环中:
// Filter for removing said category posts from main loop add_action('pre_get_posts', 'rcfh_prevent_posts'); function rcfh_prevent_posts($query) { global $RCFH_LOOP_OPTION_KEY; // Only remove categories if it's the main query/homepage if($query->is_home() && $query->is_main_query()) { $value = get_option($RCFH_LOOP_OPTION_KEY); // Modify query to remove posts which shouldn't be shown if(count($value)) { $query->set('cat', '-'.implode(',-', $value)); } } }
这样,插件就完成了!有相当多的 PHP,但用户需要做的就是启用插件和切换复选框!
花时间最终创建一个 WordPress 插件是值得的。我对那里众多的 WordPress 插件创建者表示赞赏,并且我对 WordPress 的挂钩/操作系统有了更好的了解。希望您发现这个插件很有用,并找到灵感来创建自己的插件!