【问题标题】:Wordpress - check if loop contains posts with attachments?Wordpress - 检查循环是否包含带有附件的帖子?
【发布时间】:2012-01-11 16:51:59
【问题描述】:

在 Wordpress 中,我试图将 jQuery 库的脚本排入队列,仅用于有附件的帖子。

我得到了一个适用于单个帖子的简单函数:

function gotImages()
{
    $attachments = get_children( array('post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' => 'image') );
    return ( !empty($attachments) ? true : false );
}

当我在 functions.php 中调用 gotImages() 时,它会为带有附件的单个帖子返回 true,但如果第一个帖子没有附件,则对于带有多个帖子的主页返回 false。

如何修改它以使其适用于多个帖子,即在我显示 10 个帖子的主页上?

谢谢!

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    如果您在显示十个帖子中的每一个时都在主页上的循环中,那么按原样调用它应该会产生所需的结果。它是否适用于多个帖子取决于您用于运行幻灯片的 css 选择器。如果您使用的是 CSS id,那么您的 HTML 将无效,因为您将拥有多个具有相同 id 的元素。

    【讨论】:

    • 它似乎只是检查循环中的第一个帖子。如果超过 1 个,我需要弄清楚如何遍历其余部分。函数的返回只是决定 Wordpress 是否应该将 javascript 排入队列,因此与类或 ID 无关。
    • @Johannes 你可以为你的主页发布你的 php 吗?
    • 现在不在我的电脑上,但它是默认的 211 主题。顺便说一句,我在 functions.php 中调用该函数,所以它在循环之外。
    • 你可以在你的functions.php中定义函数,但是你应该在循环中调用if。所以当你在循环中时,if(gotImages()) { //do your stuff here }
    • 好吧,如果您要显示十个帖子,您必须在某个地方使用循环、whileforeach(),对吗?无论在哪里,您都可以包含if(gotImages()) { wp_enqueue_script(); } 但不应该有理由一遍又一遍地调用相同的javascript。我认为更好的方法是将脚本排入队列一次,并使您的 jQuery 语句类似于jQuery("div.slidesWrap img").slidesMethod();。在您的函数中,返回图像而不是真假语句if(gotImages()) { foreach($images as $image) { // echo slide } }
    【解决方案2】:

    终于制定了一个粗略的工作解决方案。这可能不是最终版本,但这是我为任何可能感兴趣的人提供的解决方案。

    function gotImages()
    {
        global $wp_query;
        $posts = $wp_query->posts;
    
        if ( empty( $posts ) )
        return $posts;
    
        $searchImages = '~<img [^>]* />~';
    
        foreach ($posts as $post) {
            $content = $post->post_content;
            preg_match_all( $searchImages, $content, $countImages );
            $images += count($countImages[0]);
        }
        return ( $images >= 1 ? true : false );
    }
    

    这个函数如果放在functions.php中,会读取当前循环的内容并扫描&lt;IMG&gt;标签。如果找到一个或多个标签,则返回 true,否则返回 false。

    现在我可以使用它来有条件地将脚本或样式表排入队列,具体取决于帖子是否有任何图像。

    例如这样:

    if( !is_admin() && gotImages() == true ) :
        wp_register_script('fancybox', get_stylesheet_directory_uri() . '/libs/fancybox/jquery.fancybox.pack.js', array('jquery'), false, true);
        wp_register_script('fancybox.init', get_stylesheet_directory_uri() . '/js/init/lightbox.init', array('fancybox'), false, true);
    
        wp_enqueue_script('fancybox');
        wp_enqueue_script('fancybox.init');
    endif;
    

    我还不确定这个功能有多“昂贵”,但我正在开发的网站非常小,所以现在这并不是什么大问题,它会增加几毫秒的处理时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多