web-dev-qa-db-ja.com

Postとechoの結果に含まれる画像の総数をnumberとして数える

私は私の投稿で.jpgのURLまたは画像を数えて表示し、その結果をエコーする機能(例えば12画像)を探しています。

私は記事の中で添付された画像を数える方法を見つけただけです。 xpath関数も見つけましたが、それが機能しているかどうかはわかりません。結果をエコーすることができないからです。

これが私がこれまでに持っているものです:

function post_photo_count_xpath( $post_id ) {
global $wpdb;

$post_id_safe = intval( $post_id );

$html = $wpdb->get_row(
    "select * from {$wpdb->posts} where ID={$post_id_safe} limit 1"
);

$doc = new DOMDocument();
@$doc->loadHTML( $html->post_content );
$path = new DOMXpath( $doc );
$images = $path->query( "//img" );

return( $images->length );
}
1

正規表現を使用してすべてのURLを検索し、種類でフィルタします。

$post    = get_post( 504 );
$content = $post->post_content;

// match all urls
preg_match_all( '/(http:|https:)?\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/', $content, $matches );

$count = 0;
if ( ! empty( $matches ) && ! empty( $matches[ 0 ] ) ) {
    foreach ( $matches[ 0 ] as $url ) {
        $split    = explode( '#', $url );
        $split    = explode( '?', $split[ 0 ] );
        $split    = explode( '&', $split[ 0 ] );
        $filename = basename( $split[ 0 ] );
        $file_type = wp_check_filetype( $filename, wp_get_mime_types() );
        if ( ! empty ( $file_type[ 'ext' ] ) ) {

            // (optional) limit inclusion based on file type
            if( ! in_array( $file_type[ 'ext' ], array('jpg', 'png')) ) continue;

            $files[ $url ] = $file_type;
            $urls[]=$url;
            $count ++;
        }
    }
}

// print out urls and total count
print_r( array ( 
        'total'  => $count, 
        'unique' => array_keys( $files ),
        'urls'   => $urls 
) );

OOP

あなたがこれを再利用可能な機能として欲しいなら...

function get_file_urls( $content = '', $file_types = array ( 'jpg', 'png' ) ) {

    // match all urls
    preg_match_all( '/(http:|https:)?\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/', $content, $matches );

    $urls  = array ();
    $files = array ();

    if ( ! empty( $matches ) && ! empty( $matches[ 0 ] ) ) {
        foreach ( $matches[ 0 ] as $url ) {
            $split     = explode( '#', $url );
            $split     = explode( '?', $split[ 0 ] );
            $split     = explode( '&', $split[ 0 ] );
            $filename  = basename( $split[ 0 ] );
            $file_type = wp_check_filetype( $filename, wp_get_mime_types() );
            if ( ! empty ( $file_type[ 'ext' ] ) ) {

                // (optional) limit inclusion based on file type
                if ( ! in_array( $file_type[ 'ext' ], $file_types ) ) {
                    continue;
                }

                $files[ $url ] = $file_type;
                $urls[]        = $url;
            }
        }
    }

    // print out urls and total count
    return array (
            'total'        => count( $urls ),
            'urls'         => $urls,
            'total_unique' => count( $files ),
            'unique'       => array_keys( $files ),
    );
}

$post      = get_post( 504 );
$content   = $post->post_content;
$file_urls = get_file_urls( $content, array ( 'jpg' ) );
$count     = $file_urls[ 'total' ];

echo "<div class='count'>${count}</div>";
3
jgraup

詳細については https://blog.josemcastaneda.com/2014/03/18/get-image-count-in-wordpress-post/ をご覧ください。

// Get all the galleries in the current post
    $galleries = get_post_galleries( get_the_ID(), false );
    // Count all the galleries
    $total_gal = count( $galleries );
    /**
     * count all the images
     * @param array $array The array needed
     * @return int returns the number of images in the post
     */
    function _get_total_images( $array ){
        $key = 0;
        $src = 0;
        while ( $key < count( $array ) ){
            $src += count( $array[$key]['src'] );
            $key++;
        }
        return intval( $src );
    }

    echo _get_total_images( $galleries );
0
Kanon Chowdhury

HTMLコンテンツ、またはPHP string /変数からすべての画像URLを取得し、それらを特定の拡張子でフィルタリングし、リモートドメインのみを含めるには、次のコードを使用します。

$data = 'alsdj<img src="http://localdomain.com/donotinclude.jpg">fklasjdf<img src="image.jpg">asdfasdf<img src="http://remotedomain.com/image.jpg">asdfasdfsf<img src="dont_include_me.png">asdfasfasdf';
$images = array();

// Domains to not include images from (for instances where the full URL is specified to image)
$localhosts = array( 'localdomain.com' );
// Remove or add any extensions TO be included
$allowed_extensions = array( 'jpg', 'jpeg' );

preg_match_all('/(img|src)\=(\"|\')[^\"\'\>]+/i', $data, $media);
unset($data);
$data=preg_replace('/(img|src)(\"|\'|\=\"|\=\')(.*)/i',"$3",$media[0]);


foreach($data as $url)
{
    $url_data = parse_url( $url );
    $info = pathinfo($url);

    // Goto next, we're only looking for remote hosts
    if( ! array_key_exists( 'Host', $url_data ) ) continue;

    // Check if this is an extension we want to include
    if( array_key_exists( 'extension', $info ) && in_array( $info['extension'], $allowed_extensions) ){

        // Verify this isn't one of our local hosts (where the full URL is specified)
        if( ! in_array( $url_data['Host'], $localhosts ) ){
            array_Push($images, $url);
        }

    }

}

echo 'Total Images: ' . count( $images );
// This is just linebreaks for display formatting
print "\n\n";
echo 'Image Data:';
var_dump( $images );

コードの例: https://glot.io/snippets/ekahzvu8sh

上記のコード例の結果出力:

Total Images: 1

Image Data:array(1) {
  [0]=>
  string(27) "http://remotedomain.com/image.jpg"
}

あなたのドメインが$localhosts配列に何であるかを確実に設定するようにしてください。何らかの理由で完全なURLが指定されている場合、それはそれを含みません。

上記のコード例を使用して、そのコードを使用して画像の数を返すように更新された関数です。

function post_photo_count_xpath( $post_id ) {

    $post = get_post( $post_id );
    if( ! $post ) return 0;

    $data = $post->post_content;
    $images = array();
    // Domains to not include images from (for instances where the full URL is specified to image)
    $localhosts = array( 'localdomain.com' );
    // Remove or add any extensions TO be included
    $allowed_extensions = array( 'jpg', 'jpeg' );

    preg_match_all('/(img|src)\=(\"|\')[^\"\'\>]+/i', $data, $media);
    unset($data);
    $data=preg_replace('/(img|src)(\"|\'|\=\"|\=\')(.*)/i',"$3",$media[0]);

    if( empty( $data ) ) return 0;

    foreach( $data as $url ){
        $url_data = parse_url( $url );
        $info = pathinfo($url);

        // Goto next, we're only looking for remote hosts
        if( ! array_key_exists( 'Host', $url_data ) ) continue;

        // Check if this is an extension we want to include
        if( array_key_exists( 'extension', $info ) && in_array( $info['extension'], $allowed_extensions) ){

            // Verify this isn't one of our local hosts (where the full URL is specified)
            if( ! in_array( $url_data['Host'], $localhosts ) ){
                array_Push($images, $url);
            }

        }

    }

    return count( $images );
}

リソース: https://davebrooks.wordpress.com/2009/04/22/php-preg_replace-some-useful-regular-expressions/ /

0
sMyles