Erhalte zufällige Posts mit benutzerdefinierten Posts, die im Inhalt angezeigt werden

Ich habe eine function, innerhalb von functions.php (alle Code unten), die eine Anzeige nach x Menge von Absätzen zu jedem gegebenen single.php Beitrag single.php . Ich habe eine benutzerdefinierte Post-Typ namens advertising , die ein Titel, Bild und URL-Feld für den Werbespot hat. In jedem single.php Post habe ich ein Ankreuzfeld, um die Anzeige single.php (true / false) und ein single.php für den Autor, um auszuwählen, wie viele Absätze vor dem Einfügen der Image-Werbung single.php sollen.

AKTUALISIERTER CODE: Code unten funktioniert, jedoch kann ich keinen zufälligen Beitrag erhalten. Es zieht immer den absolut letzten Post, ohne sich zu den anderen zu drehen.

 // http parser function addhttp($url) { if (!preg_match("~^(?:f|ht)tps?://~i", $url)) { $url = "http://" . $url; } return $url; } // filter content with ad add_filter( 'the_content', 'prefix_insert_post_ads' ); function prefix_insert_post_ads( $content ) { // checkbox to show ad, default true if ( get_field('show_advertisement') ) { if ( is_single() && ! is_admin() ) { // get post-type $random_ad = get_posts(array( 'numberposts' => 1, 'post_type' => 'advertising', 'order' => 'rand', 'posts_per_page'=>'1' )); // get post-type fields $random_ad = array_shift($random_ad); $link = addhttp( get_field('advertisement_link', $random_ad->ID)); $image = get_field('upload_advertisement', $random_ad->ID); // get html $ad_code = ''; // show ad after # paragraphs $show_after = get_field('advertisement_show_after'); // return appended $content return prefix_insert_after_paragraph( $ad_code, $show_after, $content ); } else { // do nothing } } else { return $content; } } // insert ad into post function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) { $closing_p = '

'; $paragraphs = explode( $closing_p, $content ); foreach ($paragraphs as $index => $paragraph) { if ( trim( $paragraph ) ) { $paragraphs[$index] .= $closing_p; } if ( $paragraph_id == $index + 1 ) { $paragraphs[$index] .= $insertion; } } return implode( '', $paragraphs ); }

BEARBEITEN : Getriggers! Geänderte order zu orderby und der oben genannte Code funktioniert.

Solutions Collecting From Web of "Erhalte zufällige Posts mit benutzerdefinierten Posts, die im Inhalt angezeigt werden"

Wie bereits erwähnt, ist die zufällige Reihenfolge und Suche sehr kostspielig, daher sollten wir uns ansehen, wie wir dieses Problem lösen.

Da Sie nur einen Post von Ihrem benutzerdefinierten Post-Typ benötigen, benötigen wir nur eine zufällige ID, die wir an get_post() können, um den gewünschten Post zu erhalten. Anstatt den Post zufällig aus der db zu bekommen, werden wir alle benutzerdefinierten Post-Typen ( oder zumindest alle Post-IDs ) abfragen, diese in eine Transiente speichern, und dann können wir einfach eine zufällige ID aus dieser Option auswählen.

Schauen wir uns einen Code an: ( Dies geht in functions.php )

 function get_random_id( $post_type = '' ) { $q = []; // Make sure we have a post type set, check if it exists and sanitize $post_type = filter_var( $post_type, FILTER_SANITIZE_STRING ); if ( !$post_type ) return $q; if ( !post_type_exists( $post_type ) ) return $q; // The post type exist and is valid, lets continue $transient_name = 'rand_ids_' . md5( $post_type ); // Get the transient, if we have one already if ( false === ( $q = get_transient ( $transient_name ) ) ) { $args = [ 'post_type' => $post_type, 'posts_per_page' => -1, 'fields' => 'ids', // get only post ID's // Add any additional arguments ]; $q = get_posts( $args ); // Set the transient set_transient( $transient_name, $q, 30*DAY_IN_SECONDS ); } // endif get_transient return $q; } 

Was wir getan haben, haben wir jetzt alle benutzerdefinierten Post-Typ-IDs in einen Transienten gespeichert. Dies wird die performance um einen großen Betrag erhöhen. Die Transiente ist für 30 Tage festgelegt, daher müssen wir die Transiente spülen und neu erstellen, sobald wir eine neue benutzerdefinierte Beitragsart veröffentlichen.

Verwenden wir den Aktionshaken transition_post_status : ( Dies geht in functions.php )

 add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) { // Make sure we only target our specific post type if ( 'advertising' !== $post->post_type ) return; global $wpdb; // Delete the transients $wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE ('_transient%_rand_ids_%')" ); $wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE ('_transient_timeout%_rand_ids_%')" ); // Lets rebuild the transient get_random_id( $post->post_type ); }, 10, 3 ); 

Alles, was wir übrig haben, ist eine zufällige Post-ID von unserer function get_post() zu erhalten und diese an get_post() zu übergeben, um das Post-Objekt zu erhalten

 // Get the array of post ID's $post_type_posts = get_random_id( 'advertising' ); // Make sure we have posts if ( $post_type_posts ) { // Get the post object of the id first in line shuffle( $post_type_posts ); $single_post = get_post( $post_type_posts[0] ); // Display the post content } 

Auf diese Weise sparen Sie eine Menge Ressourcen und sind viel schneller, als SQL einfach einen zufälligen Beitrag aus der database auswählen zu lassen

Ein Beispiel: Ihr Advert-Injector-Filter kann ungefähr wie folgt aussehen

 add_filter( 'the_content', 'prefix_insert_post_ads' ); function prefix_insert_post_ads( $content ) { // checkbox to show ad, default true if ( get_field('show_advertisement') ) { if ( is_single() && ! is_admin() ) { // Get the array of post ID's $post_type_posts = get_random_id( 'advertising' ); // Make sure we have posts if ( $post_type_posts ) { // Get the post object of the id first in line shuffle( $post_type_posts ); $random_ad = get_post( $post_type_posts[0] ); // Display the post content $link = addhttp( get_field('advertisement_link', $random_ad->ID)); $image = get_field('upload_advertisement', $random_ad->ID); // get html $ad_code = ''; // show ad after # paragraphs $show_after = get_field('advertisement_show_after'); // return appended $content return prefix_insert_after_paragraph( $ad_code, $show_after, $content ); } } } return $content; } 

Das Verwenden eines zufälligen Offsets ist möglicherweise eine schnellere Alternative als das Sortieren nach RAND() in der generierten SQL-Abfrage:

 if( $count = wp_count_posts( 'advertising' )->publish ) { $random_ad = get_posts( [ 'post_status' => 'publish', 'offset' => rand( 0, $count - 1 ), 'posts_per_page' => 1, 'post_type' => 'advertising' ] ); } 

Hier verwenden wir den offset , um den SQL-Teil LIMIT x, 1 zu setzen, wobei x von der Anzahl der Posts abhängt.

Beachten Sie, dass dies für eine sehr große Anzahl von Reihen vielleicht nicht so toll ist , aber es gibt auch ein interessantes Benchmark- Blatt von Josh Hartman .

Pieter Goosen hat auch eine interessante Herangehensweise in seiner Antwort , die Ihnen eine viel bessere Alternative als die Bestellung durch RAND() .

get_posts sich zunächst den zufälligen Werbepost von get_posts

 $random_ad = get_posts(array( 'numberposts' => 1, 'post_type' => 'advertising', 'orderby' => 'rand' )); 

Erhalte jetzt die benutzerdefinierten Felder aus diesem zufälligen Post

 if (!empty($random_ad)) { $random_ad = array_shift($random_ad); $link = addhttp( get_field('advertisement_link', $random_ad->ID)); $image = get_field('upload_advertisement', $random_ad->ID); } 

Erstellen Sie Ihre Anzeigen-HTML und fügen Sie ein, wo Sie möchten!

 $ad_code = '';