我已经为我的单个帖子创建了一个邮件模板。
我可以使用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帖子不起作用。
有没有人对如何修改我的查询以在我的邮件模板中显示预定的帖子有什么想法?
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。