只查询包含实际文本内容的帖子(不包括短码或图片)

时间:2016-08-06 作者:Bryan Willis

我正在努力display a set of posts 包含缩略图、标题和内容/摘录。我不想显示没有用于显示/格式化目的的内容或缩略图的帖子,因为这只会显示在我的主页上。

这是一个live example 我希望它看起来像什么的工作版本。

我的问题是我有一些帖子only shortcodes (无真实内容)或just an image (页面上没有文本)。

我可以通过以下方法解决短代码问题:

$content = strip_shortcodes( get_post()->post_content );
if( \'\' !== $content ) 
然后,我尝试进一步删除上面只有图像而没有文本的帖子。就像这样:

$content = strip_shortcodes( get_post()->post_content );
$content = str_word_count( strip_tags( $content ) );
if( \'\' !== $content )
这似乎没有任何效果。帖子的显示方式与前一个示例相同。

我做错了什么,或者我应该如何做,有什么帮助吗?我如何检查帖子是否有实际内容,如文本/文字?

Here\'s my complete code below:

<?php

$args = new WP_Query(array(
    \'posts_per_page\' => 5,
    \'post__in\'       => get_option( \'sticky_posts\') ,
    \'meta_query\' => array(
        array(
            \'key\'     => \'_thumbnail_id\',
            \'compare\' => \'EXISTS\',
        ),
    ),
    \'post_status\'    => \'publish\',
    \'orderby\'        => \'post__in\',
    \'post_type\'      => array( \'post\' ),
    \'ignore_sticky_posts\' => true,
));
$the_query = new WP_Query( $args ); 

if ( $the_query->have_posts() ) {

  while ( $the_query->have_posts() ) {
    $the_query->the_post();

  $content = strip_shortcodes( get_post()->post_content );
  $content = str_word_count( strip_tags( $content ) );

  if( \'\' !== $content && has_post_thumbnail() ): ?>

      <article class="thumbnail item" itemscope="" itemtype="http://schema.org/CreativeWork">
        <a class="blog-thumb-img" href="<?php the_permalink(); ?>" title="Read more">
          <?php the_post_thumbnail(); ?>
        </a>
        <div class="caption pt30">
          <h4 itemprop="headline">
            <a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a>
          </h4>
          <p itemprop="text" class="flex-text text-muted"><?php the_excerpt();?></p>
        </div>
      </article>

  <?php endif;

  }

  wp_reset_postdata();
}
?>

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

以下是一些注意事项:

怎么做有问题$args 定义如下:

$args = new WP_Query(array( ... ) );
$the_query = new WP_Query( $args ); 
即有两个WP_Query 此处为实例,但$args 必须是数组。

这部分看起来也有问题:

$content = str_word_count( strip_tags( $content ) );
if( \'\' !== $content )
请注意str_word_count() 返回其他格式输入参数的数字或数组。

这里使用的是严格的空字符串比较。

您应该使用pre_get_posts 如果可能,请执行操作,而不是引入另一个辅助查询。

我可以看到这种方法的另一个可能的问题:如果查询只返回包含短代码或图像的帖子,那么就没有什么可显示的。

另一种方法可能是在保存帖子时自动存储该信息(例如,作为帖子元)。

如果您将其存储在post meta键下_wpse_searchable 然后可以调整元查询:

\'meta_query\' => [
   \'relation\' => \'AND\',
    [
        \'key\'     => \'_thumbnail_id\',
        \'compare\' => \'EXISTS\',
    ],
    [
        \'key\'     => \'_wpse_searchable\',
        \'value\'   => true
    ]
],
如果一篇文章不能“搜索”,下次我们更新它时,我们也可以自动删除该自定义字段。

相关推荐

浏览器刷新时删除数据库条目,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_