web-dev-qa-db-fra.com

Compter le nombre total d'images dans les résultats de publication et d'écho en tant que nombre

Je recherche une fonction qui compte et affiche les URL ou les images .jpg dans mon message, puis renvoie les résultats (par exemple, 12 images).

J'ai seulement trouvé un moyen de compter les images jointes dans l'article. J'ai également trouvé une fonction xpath, mais je ne suis pas sûre que cela fonctionne, car je ne parviens pas à lui faire écho aux résultats.

Voici ce que j'ai jusqu'à présent:

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
Vladislav Bickov

Utilisez regex pour trouver toutes les URL et filtrer par type.

$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

Si vous voulez cela comme une fonction réutilisable ...

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

pour plus d'informations, visitez 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

Pour obtenir toutes les URL d'image à partir du contenu HTML ou d'une chaîne/variable PHP, et les filtrer par une extension spécifique, et inclure uniquement les domaines distants, utilisez ce code:

$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 );

Exemple de code: https://glot.io/snippets/ekahzvu8sh

Résultat obtenu avec l'exemple de code ci-dessus:

Total Images: 1

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

Assurez-vous de définir votre domaine dans le tableau $localhosts. Ainsi, si pour une raison quelconque, l'URL complète est spécifiée, elle n'inclura pas celle-ci.

En utilisant l'exemple de code ci-dessus, voici votre fonction mise à jour pour utiliser ce code et renvoyer le nombre d'images:

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 );
}

Ressource: https://davebrooks.wordpress.com/2009/04/22/php-preg_replace-some-useful-regular-expressions/

0
sMyles