本文介绍如何优化 wordpress 自定义字段查询逻辑,避免在“查找相同邮箱的其他文章”功能中显示当前文章自身,从而实现在仅存在一个匹配结果(即当前文章)时自动隐藏整个表格。
在 WordPress 后台编辑文章时,若需检查当前文章的 email 自定义字段是否与其他 reservation 类型文章重复,常见做法是使用 get_posts() 查询全部同类文章并逐一对比。但原始代码存在一个关键问题:它未排除当前文章本身,导致即使没有真正重复项,表格仍会显示当前文章的 reference,造成误判。
最简洁、高效的解决方案是在查询阶段直接排除当前文章 ID,而非在循环中手动过滤或事后判断结果数量。只需在 $args 中添加 'exclude' => [$tmp_post->ID] 参数即可:
function samemailaddress($field) {
$emailcurrentpost = get_field('email');
$referencecurrentpost = get_field('reference');
// 临时保存当前全局 $post 对象
global $post;
$tmp_post = $post;
$args = array(
'post_type' => 'reservation',
'posts_per_page' => -1,
'exclude' => array($tmp_post->ID), // ? 关键:排除当前文章
'post_status' => 'any', // 可选:确保包含 draft/pending 等状态
);
$myposts = get_posts($args);
// 仅当存在其他匹配文章时才渲染表格
if (!empty($myposts)) {
echo '| ' . esc_html($reference) . ' |
✅ 优势说明:
⚠️ 注意事项:
该方案既满足了“保留当前文章用于对比”的原始需求(因对比发生在查询之后,且当前文章信息已提前获取),又彻底规避了“仅显示自身却误判为重复”的显示问题,是专业、健壮的 WordPress 字段校验实践。