专注 WordPress 高端企业主题的的设计与开发!即日至8月31号所有主题8折,优惠券:salongwebUser8

WordPress 文章查询类 WP_Query 如何获取序列化数组中的文章

2019 年 1 月 20 日 549次

还是在开发导航类主题 Slhao 的时候遇到的问题,主题使用 Codestar Framework 专业版选项框架,文章的 Metabox 选项都是存储在一个数组中,导致 WP_Query 不能直接使用子 meta_key 来获取文章,幸好 WordPress 功能强大,WP_Query 类选项也丰富,最终完成了有特定字段的文章输出。

一、文章中的 meta_key 内容的输出

1、单个字段的内容输出
在绝大多数 Metabox 的值都是单个的字段,直接使用:

echo get_post_meta( $post->ID, 'meta_key', true);

就可以输出字段中的内容。

2、序列化数组字段的内容输出
如果字段是一个数组(bookmark_options),输出:

echo get_post_meta( $post->ID, 'bookmark_options', true);

是没有内容,使用 var_dump() 函数打印输出则是一个数组:

array(2) {
    ["website"] => string(21) "https://salongweb.com"
    ["common"] => string(1) "1"
}

在编辑文章中假如有website和common两个选项,这时输出以下代码:

echo get_post_meta( $post->ID, 'website', true);
echo get_post_meta( $post->ID, 'common', true);

同样是没有任何内容,只有这样:

$options = get_post_meta( $post->ID, 'bookmark_options', true);
echo $options['common'];

才能输出common的内容是为1,即是输出序列化数组 bookmark_options 中的 common 字段的值。

第一部分主要是说明下序列化数组字段的获取与单个字段的不同。

二、WP_Query 中获取有某个字段的文章

1、获取有单个字段(common)的文章

$args = array(
    'post_type'           => 'bookmark',
    'ignore_sticky_posts' => 1,
    'posts_per_page'      => 4,
    'meta_key'            => 'common'
);
$wp_query = new WP_Query( $args );if ( $wp_query->have_posts() ) :
while ( $wp_query->have_posts() ) : $wp_query->the_post();
    // 输出内容
endwhile;

2、获取bookmark_options序列化数组字段中 common 值为1的文章

$args = array(
    'post_type'           => 'bookmark',
    'ignore_sticky_posts' => 1,
    'posts_per_page'      => 4,
    'meta_query'          => array(
        array(
            'key'         => 'bookmark_options',
            'value'       => 's:6:"common";i:"1";',
            'compare'     => 'LIKE',
        )
    )
);
$wp_query = new WP_Query( $args );if ( $wp_query->have_posts() ) :
while ( $wp_query->have_posts() ) : $wp_query->the_post();
    // 输出内容
endwhile;

s:6:"common";s:1:"1"为整数,如果数组值是字符串或布尔值,则应更改元查询值模式:

// 值为字符串类型
's:6:"common";s:1:"1";'
// 值为布尔值类型
's:6:"common";b:1;'

这个值,都可以在 _postmeta 数据表中对应的字段查看到,使用自定义字段中的compare参数,来进行匹配,匹配的方法为 LIKE,其它的方法还有:=、!=、>、>=、<、<=、LIKE、NOT LIKE、IN、NOT IN、BETWEEN、NOT BETWEEN、EXISTS、NOT EXISTS,所以 WP_Query 类选项是相当丰富,有时间彻底整理一个使用大全。

参考内容:https://ipfs-sec.stackexchange.cloudflare-ipfs.com/wordpress/A/question/84551.html