如何回显来自WordPress帖子的图像URL,这些URL相对地位于帖子中

时间:2020-06-22 作者:soo29

我有个问题。

我使用以下代码输出wordpress帖子的图像URL。图像URL与;附加图像“;一篇wordpress文章,而不是文章中实际使用的内容。

如果您在2年前向帖子中添加了图像,但当前不再使用该图像,则旧的未使用图像Url仍将通过代码输出。我想避免这种情况。

我需要做些什么来调整代码,以便只输出那些真正在文章源代码中或在文章中实际使用的图像URL?也可以是附加到其他wordpress帖子的图像。

<?php
if( is_single() ) {
    global $post;
    $args = array( \'post_type\' => \'attachment\', \'numberposts\' => -1, \'post_mime_type\' => \'image\', \'post_status\' => null, \'post_parent\' => $post->ID ); 
    $attachments = get_posts($args);
    if ($attachments) {
            foreach ( $attachments as $attachment ) {
                    $img_title = $attachment->post_excerpt;
                    $metadata = wp_get_attachment_metadata($attachment->ID);
                    $width = $metadata[\'width\'];
                    $height = $metadata[\'height\'];
                    echo \'<meta property="og:image" content="\'.$attachment->guid.\'"/>\';
                    echo \'<meta property="og:image:type" content="image/jpeg" />\';
                    echo \'<meta property="og:image:width" content="\'.$width.\'"/>\';
                    echo \'<meta property="og:image:height" content="\'.$height.\'"/>\';
            }
    }
}
?>

2 个回复
SO网友:Aboelabbas

如果要获取帖子内容中的实际图像,可以使用正则表达式对其进行匹配。

要仅获取图像URL和维度,您的代码可以如下所示:

if( is_single() ) {
    global $post;

    // Match the image URLs inside the post content
    $pattern = \'/<img.*src="([^"]+)"[^>]*>/\';
    $matches = [];
    preg_match_all( $pattern, $post->post_content, $matches );
    
    // Start looping if there are matches
    foreach ( $matches[1] as $url ) {

        // Remove the size portion from image URL to get the full size URL
        $url = preg_replace( \'/(\\-[0-9]+x[0-9]+)(.*)$/i\', "$2", $url );

        // calculate the image dimensions
        $image_dimensions = getimagesize($url);

        // Do whatever you want here...

    }
}
但是,如果需要获取附件的WP\\u Post对象,则必须使用attachment_url_to_postid 然后从中获取WP\\u Post;您的代码可能如下所示:

if( is_single() ) {
    global $post;

    // Match the image URLs inside the post content
    $pattern = \'/<img.*src="([^"]+)"[^>]*>/\';
    $matches = [];
    preg_match_all( $pattern, $post->post_content, $matches );
    
    // Start looping if there are matches
    foreach ( $matches[1] as $url ) {

        // Remove the size portion from image URL to get the full size URL
        $url = preg_replace( \'/(\\-[0-9]+x[0-9]+)(.*)$/i\', "$2", $url );

        // Convert the image URL to the corresponding post ID
        $attachment_id = attachment_url_to_postid( $url );

        // Get the WP_Post object for the attachment
        $attachment = get_post( $attachment_id );

        // Do whatever you want here...

    }
}
获取插入图像的post ID的另一种方法是匹配图像的HTML类。WordPress广告a类;wp image-{attachmentid}”字样;通过编辑器向每个插入的图像发送,其中{attachmentid}是插入图像的post ID。

因此,您的代码可能是这样的:

if( is_single() ) {
    global $post;

    // Match the attachments IDs inside the post content
    $pattern = \'/<img.+wp\\-image\\-([0-9]+)[^>]+>/\';
    $matches = [];
    preg_match_all( $pattern, $post->post_content, $matches );

    // Start looping in the found matches
    foreach ( $matches[1] as $attachment_id ) {

        // Get the WP_Post object for the attachment
        $attachment = get_post( $attachment_id );

        // Do whatever you want here...
        
    }
}

SO网友:soo29

谢谢你的帮助。我将您的代码的这个变体与一些不同的preg\\u replace代码一起使用。如果图像URL包含像“这样的数字-510x383.jpg“;我对你的代码有一些问题。

<?php
if( is_single() ) {
    global $post;
    $pattern = \'/<img.*src="([^"]+)"[^>]*>/\';
    $matches = [];
    preg_match_all( $pattern, $post->post_content, $matches );
    foreach ( $matches[1] as $url ) {
        $clean_url  = preg_replace(\'/<img .*src=["|\\\']([^"|\\\']+)/i\', "", $url );
        $https_url  = str_replace("http:", "https:", $clean_url);
        list($width, $height) = getimagesize($https_url);
        echo \'<meta property="og:image" content="\'.$https_url.\'"/>\';
        echo \'<meta property="og:image:type" content="image/jpeg" />\';
        echo \'<meta property="og:image:width" content="\'.$width.\'"/>\';
        echo \'<meta property="og:image:height" content="\'.$height.\'"/>\';
    }
}
?>

相关推荐

Responsive header images

我刚刚建立了一个WordPress网站,但我的其他WordPress网站都有同样的问题:标题图像没有响应。不管屏幕有多小,它都有2000像素宽。我尝试了各种修复,从添加自定义CSS到安装特殊插件,但都没有成功。我最终通过选择不显示标题图像,然后打开文件标题来修复它。并手动在标题上方插入指向图像的链接。它工作得很好,但有两个注意事项。网站标题(在h1标签中)现在位于标题图像下方,而不是上方。此外,此修复程序仅适用于主页。我还没有弄清楚我要为其他页面做什么,除非我选择只在主页上使用标题图像。所以在我继续之前,