我正在从头开始开发我的第一个自定义主题(使用根作为基本框架)。主题有两个CPT,一个用于事件,一个用于关联,二者之间的关联为一对多(一个关联可以关联多个事件)。
我用pre\\u get\\u posts修改了主查询,以便在主页中显示事件。
现在,我想在侧栏上创建一个小部件,以显示具有关联事件的关联列表。我还想在每个关联的名称附近显示关联的事件数。如果我单击其中一个,我想进入一个归档页面,其中列出仅针对该关联的事件。
可以把它想象成标准的归档插件,但要有关联,而不是几个月。
我不知道在自定义小部件主功能中必须执行哪种类型的查询。这是我目前的代码:
private function getAssociationsList(){
// The Query
$associations = new WP_Query( array(\'post_type\' => \'associations\' ) );
if($associations->found_posts > 0) {
echo \'<ul>\';
while ($associations->have_posts()) {
$associations->the_post();
$events_query = array(
\'post_type\' => \'events\',
\'meta_query\'=> array(
array(
\'key\' => \'mlw_event_association\',
\'value\' => get_the_ID()
)
)
);
$events_for_this_association = new WP_Query($events_query);
if($events_for_this_association->found_posts > 0){
$listItem = \'<li>\';
$listItem .= \'<a href="\' . get_permalink() . \'">\';
$listItem .= get_the_title() . \'</a>\';
$listItem .= \' (\'. $events_for_this_association->post_count . \')</li>\';
echo $listItem;
}
}
echo \'</ul>\';
wp_reset_postdata();
}else{
echo \'<p>_("No association with upcoming events at the moment")</p>\';
}
}
这里的问题是get\\u permalink()是指向关联页面的链接,而不是指向“筛选”存档页面的链接。此外,此查询始终显示标记,即使与相关事件没有关联。
如有任何建议,将不胜感激。
非常感谢。
SO网友:Privateer
我重新编写了该函数,对其进行了一些修改。
主要更改是指定要在调用中链接到的关联的IDget_permalink
使用$association->ID
而不是打电话get_the_title
(尽管您可以在“获取标题”中放置相同的ID)。
我还从使用\\u post()切换到使用next\\u post(),它将下一个post拉入一个变量,而不是踩踏各种post全局变量。
最后,由于函数是getAssociationsList,我让它返回输出,而不是回显输出。(我更改了名称……因为当人们需要稍微翻译一下函数名时,使用下划线会有所帮助)
无论如何,我希望这有帮助!
private function get_associations_list(){
$associations = new WP_Query( array(\'post_type\' => \'associations\' ) );
$output = \'\';
if( $associations->found_posts > 0 ) {
$output .= \'<ul>\';
while ($associations->have_posts()) {
# changed to use next_post() so we can avoid messing with the global query
# which avoids needing to use reset below.
$association = $associations->next_post();
# block this out as we no longer need it
# $associations->the_post();
# Changed value to use the objects ID rather than calling an extra function to get it
$events_query = array(
\'post_type\' => \'events\',
\'meta_query\'=> array(
array(
\'key\' => \'mlw_event_association\',
\'value\' => $association->ID
)
)
);
# Checked via have_posts
# - added target object to get permalink and title for
# - changed count to use found_posts instead of post_count
$events_for_this_association = new WP_Query($events_query);
if ( $events_for_this_association->have_posts() ) {
# There is at least one
$association_link = get_permalink( $association->ID );
$association_title = $association->post_title;
$association_event_count = $events_for_this_association->found_posts;
$output .= <<<HTML
<li><a href="{$association_link}">{$association_title}</a> ({$association_event_count})</li>
HTML;
}
}
$output .= \'</ul>\';
# no longer needing to reset post data as we never used the global space
# wp_reset_postdata();
}else{
$output = \'<p>\' . __("No association with upcoming events at the moment") . \'</p>\';
}
# Maybe give caller option to echo it immediately instead of echoing it.
return $output;
}