WordPress 文章查询类 WP_Query 如何获取序列化数组中的文章
还是在开发导航类主题 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