obtém o número total de imagens da mídia usando xml-rpc

4

Eu tenho um grande número de imagens na biblioteca de mídia, por isso estou acessando imagens em partes por meio de paginação em meu aplicativo Ruby on Rails. Eu passo número de página e desloco para wp.getMediaLibrary API e ele retorna um número fixo de imagens. Então contar as imagens devolvidas é inútil.

Aqui está minha abordagem para obter o número total de imagens.

Se chamarmos wp.getMediaLibrary sem passar number e offset , ele retornará todas as imagens e poderemos obter a contagem de imagens dos resultados.

Mas o problema com essa abordagem é que o site tem um grande número de imagens e, por isso, algo dá errado na extremidade do servidor e na resposta vazia do retorno da API.

Alguém pode me orientar como obter imagens sem obter todas as informações de imagens?

    
por Amit Patel 16.12.2015 / 14:39

2 respostas

1

A VERSÃO 1 consultará todas as imagens e fornecerá uma contagem, verificando o tamanho da matriz retornada. A VERSÃO 2 é um método muito mais rápido introduzido pelo 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 - Para obter uma solução completa de XML-RPC , crie um método personalizado.

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

Então faça o 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>';
}

UPDATE Mesclando a solução da @ birgire para essa.

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');
});
    
por jgraup 16.12.2015 / 18:11
-3

Eu não acho que o WordPress tenha alguma função para retornar apenas a contagem de imagens da Biblioteca de Mídia.

Não estou familiarizado com o XML RPC, mas com base em este post e esta postagem , acho que você pode adicionar métodos personalizados. p>

Se funcionar para você, use a consulta abaixo para obter uma contagem de imagens da Biblioteca de mídia:

global $wpdb;

$wpquery = $wpdb->get_results(
    "SELECT COUNT(*) FROM wp_posts WHERE post_type ='attachment' AND post_status = 'inherit'"
);
$count = mysql_fetch_array( $wpquery );

$wpdb->get_results( 
    "SELECT * FROM wp_posts WHERE post_type ='attachment' AND post_status = 'inherit'" 
);
$count = $wpdb->num_rows;
    
por Viren Dave 18.12.2015 / 20:27