web-dev-qa-db-fra.com

trouver un blogid aléatoire sur mon réseau multisite ayant au moins un post publié

Je dois rechercher un blog au hasard sur mon réseau multisite ayant au moins un message publié d'un certain type de post_type, puis renvoyer son blogid en tant que variable afin que je puisse l'utiliser dans un appel switch_to_blog().

J'ai besoin de comprendre comment construire la variable $ randomblog dans ce scénario (je sais que la requête SQL actuelle est fausse):

// Find a random blog that has at least one post of post_type published and return its blogid as $randomblog
$randomblog = $wpdb->get_results($wpdb->prepare("SELECT (1 random blogid) FROM $wpdb->blogs WHERE at least 1 of post_type = 'special' exists "));

// Switch to the random blog
    switch_to_blog($randomblog);

        (do some fun stuff)

    // Switch back to the current blog
    restore_current_blog();

Je ne suis pas sûr, mais je crois que ce morceau de code que j'ai trouvé pourrait éventuellement être modifié pour faire ce dont j'ai besoin. Juste pas sûr de savoir comment:

global $wpdb;
global $table_prefix;

// get an array of the table names that our posts will be in
// we do this by first getting all of our blog ids and then forming the name of the 
// table and putting it into an array
$rows = $wpdb->get_results( "SELECT blog_id from $wpdb->blogs WHERE
    public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" );
if ( $rows ) :
$blogPostTableNames = array();
foreach ( $rows as $row ) :
    $blogPostTableNames[$row->blog_id] = $wpdb->get_blog_prefix( $row->blog_id ) . 'posts';
endforeach;

// now we need to do a query to get all the posts from all our blogs
// ordered by the number of comments and with limits applied
if ( count( $blogPostTableNames ) > 0 ) :
    $query = '';
    $i = 0;
    foreach ( $blogPostTableNames as $blogId => $tableName ) :
        if ( $i > 0 ) :
            $query.= ' UNION ';
        endif;
        $query.= " SELECT ID, post_type, $blogId as `blog_id` FROM $tableName WHERE post_type = 'Prompt' AND post_status = 'publish' ";
        $i++;
    endforeach;

    $rows = $wpdb->get_results( $query );

    // now we need to get each of our posts into an array and return them
    if ( $rows ) :
        $posts = array();
        foreach ( $rows as $row ) :
            $posts[] = get_blog_post( $row->blog_id, $row->ID );
        endforeach;
        print_r($posts);
        return $posts;
        echo ('<br /><br />');
    endif;
endif;
endif;
4
quirk

Un exemple qui affiche une notification de l'administrateur répertoriant un tableau aléatoire avec tous les ID de blog, le résultat d'un get_posts( array( 'numberposts' => 1 ) ) et indiquant le premier dont get_posts est différent de zéro.

Résultat

admin notice listing all blogs and number of posts found

Après l'actualisation:
admin notice after refreshing

Code

add_action( 'admin_notices', 'wpse_60401_print_random_blog' );

function wpse_60401_print_random_blog()
{ 
    global $wpdb;

    $rows = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id from $wpdb->blogs WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" ) );

    if( !$rows )
    {
        echo '<div class="error">No blogs found (!)</div>';
    }
    else
    {
        shuffle( $rows );
        $counter = 0;
        echo '<div class="error">';
        foreach ( $rows as $row ) 
        {
            switch_to_blog( $row->blog_id );
            $get_posts = get_posts( array( 'numberposts' => -1 ) );
            echo 'Blog ID: ' . $row->blog_id . ' - Number posts: ' . count($get_posts) . '<br />';

            if( count($get_posts) != 0 && $counter == 0 ) 
            {
                echo 'First blog with a post: ' . $row->blog_id . '<br />';
                $counter++;
            }
                    restore_current_blog();
        }
        echo '</div>';
    }

}

Coder sous forme une fonction utilisable

function get_random_blog()
{ 
    global $wpdb;

    $rows = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id from $wpdb->blogs WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" ) );

    if( !$rows )
    {
        return 0;
    }
    else
    {
        shuffle( $rows );
        foreach ( $rows as $row ) 
        {
            switch_to_blog( $row->blog_id );
            $get_posts = get_posts( array( 'numberposts' => -1 ) );

            if( count($get_posts) != 0 ) 
            {
                restore_current_blog();
                return $row->blog_id;               
            }
        }
    }
    restore_current_blog();
    return 0;
}
1
brasofilo