在查询前运行筛选器或快捷代码会阻止显示摘录

时间:2016-06-22 作者:Killinski

我一直在为我发现的一个函数拼凑一些代码,该函数于2009年左右首次发布,我对PHP的缺乏经验让我不知所措。

该功能旨在统计播客类别中的剧集,因此:

function Get_Post_Number($postID){
$temp_query = $wp_query;
$postNumberQuery = new WP_Query(array (
\'orderby\' => \'date\',
\'order\' => \'ASC\',
\'post_type\' => \'any\',
\'category_name\' =>\'podcast-episodes\',
\'posts_per_page\' => \'-1\'
));
$counter = 1;
$postCount = 0;
if($postNumberQuery->have_posts()) :
    while ($postNumberQuery->have_posts()) : $postNumberQuery->the_post();
        if ($postID == get_the_ID()){
            $postCount = $counter;
        } else {
            $counter++;
        }
endwhile; endif;
wp_reset_query();
$wp_query = $temp_query;
return $postCount;
}
据我所知,这很好用。我创建了一个短代码来返回查询中的值,这导致摘录没有显示出来。然后我创建了一个过滤器来执行同样的操作,结果也是一样的。无摘录。在这里,我只发布短代码:

/**
* Create shortcode to display Episode count.
*/

function episodeNo() {
    $epID = get_the_ID();
    $epNumber = Get_Post_Number($epID);
    echo \'Episode \' . $epNumber;
    }
add_shortcode(\'episode\',\'episodeNo\');
以下是我的疑问:

$args = array(
                    \'posts_per_page\'        => 3,
                    \'category_name\'         => \'podcast-episodes\'
                );  
$query = new WP_Query( $args );
                // The Loop
                if ( $query->have_posts()){
                    echo \'<ul class="entries">\';
                    while ( $query->have_posts() ) {
                        $query->the_post();
                        echo \'<div class="entries-post">\';
                        echo \'<a href="\' . get_permalink() . \'">\';
                        echo \'<h1 class="entries-title">\' . get_the_title() . \'</h1>\';
                        echo \'</a>\';
                        do_shortcode(\'[episode]\');
                        echo \'<div class="entries-excerpt">\';
                        the_excerpt();
                        echo \'</div>\';
                        echo \'</div>\';
                        }
                    }
                    echo \'</ul>\';

                }
                /* Restore original Post Data */
                wp_reset_postdata();
现在,如果短代码在\\u节选之前运行,它会正确显示集号,但不会显示节选。

Title

第11集

Title

第10集

Title

第9集

如果在节选之后运行,则会正确显示节选和集号:

Title

这周我喝咖啡时哭了

第11集

Title

本周我将着手一个新的设计项目

第10集

Title

这周我主要玩电子游戏

第9集

不幸的是,设计是这样的,插曲必须在节选之前显示出来。

如果我使用与短代码执行相同职责的过滤器,则会发生完全相同的情况。

有没有人知道如果在这个短代码之后调用,\\u摘录,为什么无法显示?我确信这是计算或返回剧集编号的方式,但我知道的太少,无法自己更正。相信我,我已经试过了。最后

2 个回复
最合适的回答,由SO网友:cbonomini 整理而成

在返回$postCount之前,似乎需要对post数据进行休息。在返回之前,请添加以下内容:

wp_reset_postdata();
--

两者之间有区别wp_reset_query()wp_reset_postdata(), 如前所述here.

  • wp_reset_query() - 确保主查询已重置为原始主查询
  • wp_reset_postdata() - 确保全局$post已还原到主查询中的当前post

SO网友:birgire

我认为您可以通过使用以下工具大大简化代码:

$episode_number = ( $query->found_posts - $query->current_post );
在循环中作为插曲的编号。

所以你不需要有问题Get_Post_Number() 函数,无需为此使用特殊的短代码。

相关推荐

浏览器刷新时删除数据库条目,AJAX PHP jQuery

我有一个表单,在通过ajax提交表单时更新数据库表中的列。一切都很好,数据库表列可以获取信息,但一旦刷新浏览器,信息就会从数据库中删除。如果meta\\u值不存在,但meta\\u值也在提交表单时创建的数据库中,则PHP将执行数据库更新。我希望信息保留在数据库中,直到或除非meta\\u值被删除或不存在。任何见解都将不胜感激。PHPadd_action(\'wp_ajax_hide_this\', \'hide_this_by_id\'); add_action(\'wp_ajax_nopriv_