wordpress 在WP后循环中比较两个ACF值

tf7tbtn2  于 12个月前  发布在  WordPress
关注(0)|答案(2)|浏览(208)

我在我的网站上为每个团队成员都有一个专门的页面。页面的标题是他们的名字和姓氏。对于我网站上的每个帖子,我都有两个ACF 'author'字段。我试图编写一个查询,以确定当前团队成员是否有任何author_1或author_2包含其姓名的帖子。
我目前得到0职位返回,即使我肯定我应该得到一些。下面是我的代码。

function hide_cotw_heading(){
    $title = get_the_title();
    global $post;

    $latest_posts= get_posts( array(
        'category' => 9,
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'     => 'author_1',
                'value'   => $title,
                'compare' => 'LIKE',
            ),
            array(
                'key'     => 'author_2',
                'value'   => $title,
                'compare' => 'LIKE',
            ),
        )
    ) );

      if($latest_posts){
        return 'Has posts';
      } else{
        return 'No posts';
      }
}

字符串

kq0g1dla

kq0g1dla1#

您遇到的问题可能源于高级自定义字段(ACF)如何存储选择字段的数据,例如您的'author_1'和'author_2'。ACF将它们存储为序列化数组,这可能会使使用WordPress的Meta_query的直接查询复杂化。当您尝试匹配此数组的特定部分时,(就像标签一样),标准的Meta_query是不够的,因为它不是设计来解析序列化数组或针对其中的特定元素的。
由于ACF将标签和值存储为数组,而Meta_query将此数组视为字符串,因此使用'LIKE'可能无效,因为序列化字符串的格式可能会有所不同。然而,我的解决方法是检索所有帖子,然后根据标签手动过滤它们。这可能效率较低,但考虑到数据结构,这可能是必要的。

function hide_cotw_heading() {
    $title = get_the_title();
    $matching_posts = array();

    $args = array(
        'post_status'   => 'publish',
        'posts_per_page' => -1, 
        'category'      => 9,
        
    );

    $all_posts = get_posts($args);

    foreach ($all_posts as $post) {
        $author_1_data = get_field('author_1', $post->ID); 
        $author_2_data = get_field('author_2', $post->ID);

      
        if (($author_1_data && $author_1_data['label'] === $title) ||
            ($author_2_data && $author_2_data['label'] === $title)) {
            $matching_posts[] = $post;
        }
    }

    return count($matching_posts) > 0 ? 'Has posts' : 'No posts';
}

字符串

mcvgt66p

mcvgt66p2#

我已经修改了你的代码,所以请试试这个

function hide_cotw_heading() {
    $title = get_the_title();

    $args = array(
        'post_status'   => 'publish',
        'posts_per_page'=> -1, // Retrieve all matching posts
        'category'      => 9,
        'meta_query'    => array(
            'relation' => 'OR',
            array(
                'key'     => 'author_1',
                'value'   => $title,
                'compare' => '=',
            ),
            array(
                'key'     => 'author_2',
                'value'   => $title,
                'compare' => '=',
            ),
        )
    );

    $latest_posts = get_posts($args);

    if ($latest_posts) {
        return 'Has posts';
    } else {
        return 'No posts';
    }
}

字符串
下面是将与ACF数组一起使用的更新代码

function hide_cotw_heading() {
    $title = get_the_title();

    // Query for all posts in the category
    $args = array(
        'post_status'   => 'publish',
        'posts_per_page'=> -1,
        'category'      => 9,
    );

    $all_posts = get_posts($args);
    $relevant_posts = [];

    foreach ($all_posts as $post) {

        $author_1 = get_field('author_1', $post->ID);
        $author_2 = get_field('author_2', $post->ID);

        if ((isset($author_1['label']) && $author_1['label'] === $title) ||
            (isset($author_2['label']) && $author_2['label'] === $title)) {
            $relevant_posts[] = $post;
        }
    }

    if (!empty($relevant_posts)) {
        return 'Has posts';
    } else {
        return 'No posts';
    }
}

相关问题