我使用过ACF。我添加了分类标准'选择下拉字段到帖子编辑页面。从下拉列表中我选择了该帖子应该包含哪个类别,但我的代码显示的是所有类别中的相同帖子。
以下是category.php文件中的代码。我需要它来显示最近的帖子,该帖子已被赋予“类别特征”,因此在我定义的类别中有特色。
我在category.php中的当前循环
<?php
$category = get_field('feature_in_category');
// args
$args = array(
'numberposts' => -1,
'posts_per_page' => 1,
'category__in' => $category,
'orderby'=> 'modified'
);
// get results
$the_query = new WP_Query( $args );
// The Loop
?>
<?php if( $the_query->have_posts() ): ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<div class="small-6 columns">
<div class="img-box-shadow">
<a href="<?php the_permalink(); ?>">
<?php echo the_post_thumbnail(); ?>
</a>
</div>
</div>
<div class="small-6 columns">
<h3><a href="<?php the_permalink(); ?>"><?php echo the_title(); ?></a></h3>
<p><?php echo the_excerpt(); ?></p>
</div>
<?php endwhile; ?>
<?php else : echo '<p style="color:#fff;">no posts</p>'; ?>
<?php endif; ?>
<?php wp_reset_query(); // Restore global post data stomped by the_post(). ?>
Pastebin:http://pastebin.com/NR3UanAd
答案 0 :(得分:2)
我对ACF并不熟悉,还没有使用它。我看了一些文档等,这就是我发现的:
ACF分类法字段将在您的应用程序中返回NULL
,因为传递给get_field
的ID是类别ID,这是一个无效的帖子ID。是的,您可以将类别ID传递给get_field
,但是必须为该特定类别分配自定义字段才能返回该自定义字段的值。
查看ACF docs
$field = get_field($field_name, $post_id, $format_value);
◦ $ post_id :输入值的特定帖子ID。默认为当前帖子ID(不是必需的)。这也可以是选项/分类/用户/等
正如我之前所说,我不熟悉ACF,但似乎ACF字段数据的存储方式与默认自定义字段存储数据的方式相同。因此,您将拥有一对匹配的key=>value
套。可以通过meta_query
ACF分类标准下拉列表保存已转换为类别的选定值。同样,我不确定它是否保存了名称,slug或ID,但是从我可以提取的内容中,它保存了类别ID,因此我将对此进行假设
因此,首先要做的是,获取当前查看的类别ID。这可以通过get_queried_object_id()
现在您拥有了当前的类别ID,您需要将其与特定meta_key=feature_in_category
的值相匹配,并返回附加了此{c}}对的帖子
您的代码看起来应该是这样的,假设ACF数据的存储方式与从自定义字段存储数据的方式相同(此代码需要PHP5.4 +,对于早期版本,更改{{1} } key=>value
)
[]
如果ACF字段未保存类别ID,并保存名称或slug,您可以按如下方式更改代码
array()
或
$cat_id = get_queried_object_id(); // Assumption that category ID is saved by ACF
$args = [
'posts_per_page' => 1,
'orderby' => 'modified',
'meta_key' => 'feature_in_category',
'meta_value_num' => $cat_id, // Assumption that category ID is saved by ACF
];
$q = new WP_Query( $args );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
// YOUR TEMPLATE TAGS AND MARKUP
}
wp_reset_postdata();
}
然后在您的查询参数中,更改
$category = get_queried_object()->name; // For category name
到
$category = get_queried_object()->slug; // For category slug
修改强>
另外,作为评论发布,OP使用的查询基础,工作。
'meta_value_num' => $cat_id, // Assumption that category ID is saved by ACF
答案 1 :(得分:0)
在此处查看文档http://codex.wordpress.org/Class_Reference/WP_Query后,您的代码似乎正在执行所有正确的操作。我相信您的答案在于用于生成结果的实际查询字符串。您应该能够通过执行以下操作在查询对象的属性中查看该查询字符串:
<?php
$category = get_field('feature_in_category');
// args
$args = array(
'numberposts' => -1,
'posts_per_page' => 1,
'category__in' => $category,
'orderby'=> 'modified'
);
// get results
$the_query = new WP_Query( $args );
echo '<pre>'; print_r($the_query); die();
我建议您使用phpMyAdmin或Navicat等直接连接到数据库的数据库上直接看到它后运行查询字符串。您应该能够在那里调整查询以产生所需的结果,然后相应地调整您的参数。也可能是您的查询没有任何问题,而问题在于类别功能。这种调试方法也应该揭示这种情况。
更新: 我认为你只需要使用'cat'而不是'category__in'。此外,请确保在调用get_field时使用您为字段名称设置的内容。此反馈基于此示例:http://www.the-perfect-life.org/html-5-css-3-php-wordpress-jquery-javascript-photoshop-illustrator-tutorial/how-to-create-custom/wordpress-plugin-theme-codex-code-function/advanced-custom-fields-get-field-taxonomy-query-related-posts-by-tag-and-category/
$categoryValue = get_field('feature_in_category');
$args=array(
'cat' => $categoryValue,
'posts_per_page'=>1 // Number of related posts to display
);
$my_query = new wp_query( $args );
while( $my_query->have_posts() ) {
$my_query->the_post();
?>
<div>
<a href="<? the_permalink()?>">
<?php the_title(); ?>
</a>
</div>
wp_reset_query();