web-dev-qa-db-fra.com

obtenir le nombre total d'images des médias en utilisant xml-rpc

J'ai un grand nombre d'images dans la médiathèque et j'accède donc aux images en morceaux via la pagination dans mon application Ruby on Rails. Je passe le numéro de page et l'offset à l'API wp.getMediaLibrary et renvoie un nombre fixe d'images. Compter les images retournées est donc inutile.

Voici mon approche pour obtenir le nombre total d'images.

Si nous appelons wp.getMediaLibrary sans passer number et offset, toutes les images seront renvoyées et nous pourrons obtenir le nombre d'images à partir des résultats.

Mais le problème avec cette approche est que le site contient un grand nombre d’images et qu’il ya donc un problème avec la fin du serveur et que l’API renvoie une réponse vide.

Quelqu'un peut-il me guider s'il vous plaît comment obtenir le décompte des images sans obtenir toutes les informations sur les images?

3
Amit Patel

VERSION 1interrogera toutes les images et vous donnera un décompte en vérifiant la taille du tableau retourné.VERSION 2est une méthode beaucoup plus rapide introduite par birgire .

// VERSION 1

    $images = get_posts(array(
        'post_type'         => 'attachment',
        'post_status'       => 'any',
        'numberposts'       => -1,
        'fields'            => 'ids',
        'post_mime_type'    => 'image/jpeg,image/gif,image/jpg,image/png',
    ));

    echo count($images) . ' images total';

// VERSION 2

    $count = array_sum( (array) wp_count_attachments( 'image' ) );

    echo "{$count} images total";

ORIGINAL- Pour une solution complète XML-RPC , créez une méthode personnalisée.

function xml_add_method( $methods ) {
    $methods['myNamespace.attachmentCount'] = 'get_attachment_count';
    return $methods;
}
add_filter( 'xmlrpc_methods', 'xml_add_method' );

function get_attachment_count( $args ) {
    // good to know it's here
    // global $wpdb; 

    // params passed in the call - not needed in this example
    $params = $args[3];

    // count the posts then return the total value
    $images = get_posts(array(
        'post_type'         => 'attachment',
        'post_status'       => 'any',
        'numberposts'       => -1,
        'fields'            => 'ids',
        'post_mime_type'    => 'image/jpeg,image/gif,image/jpg,image/png',
    ));

    // images total
    return count($images); 
}

Alors faites le RPC

global $current_user;

$user = $current_user->user_login;
$password = $user->data->user_pass;

include_once( ABSPATH . WPINC . '/class-IXR.php' );
include_once( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' );
$xmlrpc_url = home_url('xmlrpc.php');
$client = new WP_HTTP_IXR_CLIENT( $xmlrpc_url );

// set this to true if you need help
// $client->debug = true;

$response = $client->query( 'myNamespace.attachmentCount', array(
    0,
    $user,
    $password,
    array(
        'post_type'         => 'attachment',
        'post_status'       => 'any',
    )
) );

if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Something went wrong: $error_message";
} else {
    echo 'Response:<pre>';        
    $count = $client->message->params[0]; // our return value is here
    print_r( $count . ' images total' );
    echo '</pre>';
}

UPDATEFusion de la solution de @ birgire dans celle-ci.


add_filter('xmlrpc_methods', function ($methods) {
    $methods['myNamespace.getTotalImageCount'] = 'rpc_myNamespace_getTotalImageCount';
    return $methods;
});

function rpc_myNamespace_getTotalImageCount($args)
{
    return array_sum((array)wp_count_attachments('image'));
}

add_action('parse_request', function () {

    // PULL USER CREDS FROM CURRENT USER
    global $current_user;

    $user = $current_user->user_login;
    $password = $user->data->user_pass;

    include_once(ABSPATH . WPINC . '/class-IXR.php');
    include_once(ABSPATH . WPINC . '/class-wp-http-ixr-client.php');
    $xmlrpc_url = home_url('xmlrpc.php');
    $client = new WP_HTTP_IXR_CLIENT($xmlrpc_url);

    // CALL OUR CUSTOM METHOD
    $response = $client->query('myNamespace.getTotalImageCount', array(0, $user, $password));

    echo 'Response:<pre>';
    $count = $client->message->params[0];
    print_r("{$count} total images");
    echo '</pre>';

    wp_die('FIN');
});
1
jgraup