查询以查看计划发布或草稿发布

时间:2014-03-18 作者:Joshc

我已经为我的单个帖子创建了一个邮件模板。

我可以使用url变量查看帖子的邮件版本?mailer

我已经在我的single.php...

if ( isset($_GET["mailer"]) ) {  

    get_template_part( \'mailer/template\', \'post\' );

} else {
/**
 * @package WordPress
 * @subpackage Josh 2014
 * @since MyTheme 1.0
*/
get_header();
真的很简单。

然后我使用get_permalink().\'/?mailer\' 然后我将其传递给活动监视器,以通过url导入我的邮件程序模板。

在我的mailer/template-single.php 我使用这个基本循环来获取我的帖子数据。

<?php

    if ( have_posts() ) :                                       
    while ( have_posts() ) : the_post();
?>

<!-- MY POST -->

<?php
    endwhile;                       
    endif;
?>
以上一切正常。


My problem I have ran into today is with scheduled posts.

我想能够查看我的帖子仍然(未登录时)仅在邮件模板中,而不是在网站上。

所以我把邮件模板中的代码修改为。。。

<?php

    $args = array(
                \'post_status\' => array(\'publish\',\'pending\',\'draft\',\'future\',\'private\')
            );

    query_posts( $args );
    if ( have_posts() ) :                                       
    while ( have_posts() ) : the_post();

?>

<!-- MY POST -->

<?php
    endwhile;                       
    endif;
?>
然后,我在未登录的新浏览器中使用mailer变量访问了预定的post permalink。我的网站上出现了404错误。

http://www.mywebsite.com/scheduled-test-post/?mailer
所以我猜我上面的query\\u帖子不起作用。

有没有人对如何修改我的查询以在我的邮件模板中显示预定的帖子有什么想法?

2 个回复
SO网友:s_ha_dum

首先,不要使用query_posts().

注:This function isn\'t meant to be used by plugins or themes. 如后文所述,有更好、性能更好的选项来更改主查询。query_posts() is overly simplistic and problematic 通过将页面的主查询替换为查询的新实例来修改页面的主查询的方法。

http://codex.wordpress.org/Function_Reference/query_posts

但问题就在这里。

http://www.mywebsite.com/scheduled-test-post/?mailer

您正在尝试在未登录的情况下访问计划的帖子。问题不在于上面的代码。这是内置在WordPress中的。从逻辑上讲,在计划日期之前,计划的帖子不应该向普通用户显示。这种逻辑是在加载模板之前很久建立的。该模板中的代码将无效。

让事情复杂化,the post statuses are rabidly protected. 您会注意到,该代码位于查询本身之后,实际上会阻止可能已返回的内容。显而易见的解决方案。。。

function allow_scheduled($qry) {
  if (
    $qry->is_main_query()
    && $qry->is_single()
    && isset($_GET[\'mailer\'])
  ) {
    $qry->set(\'post_status\',array(\'publish\',\'future\'));
    echo \'fired\';
  }
}
add_action(\'pre_get_posts\',\'allow_scheduled\');
。。。不起作用。

我所知道的唯一简单的方法就是直接用get_post().

因此,您必须尽早中断该过程并绕过一些核心。类似于:

function allow_scheduled($posts) {
  remove_action(\'posts_results\',\'allow_scheduled\');
  if (
    isset($_GET[\'mailer\'])
    && 1 == count($posts)
    && \'future\' == $posts[0]->post_status
  ) {
    add_action(
      \'template_include\',
      function() use ($posts) {
        get_header();
        $q = get_post( $posts[0]->ID );
        var_dump($q);
        // do stuff
        get_footer();
        exit;
      }
    );
  }
}
add_action(\'posts_results\',\'allow_scheduled\');
你本质上是让每个人都可以访问你预定的帖子,一旦他们发现?mailer 戏法我并不特别喜欢这样,老实说,这一切都有点复杂。我会考虑endpoint 或者可能利用AJAX API。

SO网友:James Kemp

编辑帖子时,请单击“预览帖子”。这将带您访问带有查询字符串的URL。然后,您应该能够附加:

&mailer=1
编辑,这将在没有查询的情况下工作-您永远不应该在单个模板上以这种方式进行查询。

结束

相关推荐

指定我的‘Tax_Query’中的帖子数

我正在显示属于分类“部分”的术语“足球”的帖子,一切都很好,但我在哪里可以指定要显示的帖子数量?就像这样:“showposts”=>3我不知道放在哪里 $myquery[\'tax_query\'] = array( array( \'taxonomy\' => \'section\', \'terms\' => array(