Случайное изображение на основе категории

Я хочу расширить приведенный ниже код, чтобы выбрать случайное изображение, основанное на определенной категории. Нижеследующее работает, но использует общий список изображений, чтобы вытащить из списка изображений на основе определенных категорий. В нижеследующем, любое изображение, начинающееся с «UF-», выбирается случайным образом для использования в качестве отображаемого изображения.

Может ли кто-нибудь помочь указать мне в правильном направлении? В идеале, нужно иметь несколько изображений для каждой категории, которые используются случайным образом.

function autoset_featured() { global $post; $already_has_thumb = has_post_thumbnail($post->ID); if (!$already_has_thumb) { $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" ); if ($attached_image) { foreach ($attached_image as $attachment_id => $attachment) { set_post_thumbnail($post->ID, $attachment_id); } } else { set_post_thumbnail($post->ID, get_image()); } } } function get_image(){ $list = array(); $data = array(); $media_query = new WP_Query( array( 'post_status' => 'inherit', 'post_parent' => 0, 'post_type' => 'attachment', 'post_mime_type' => 'image/jpeg' )); foreach ($media_query->posts as $post) { $fullpath = wp_get_attachment_url($post->ID); $list = (explode("/", $fullpath)); $string = $post->ID.'|'.$list[sizeof($list)-1]; if (substr($list[sizeof($list)-1],0,3) == 'UF-') { array_push($data,(explode("|", $string))); $idx = mt_rand(0, count($data)-1); $img_id = $data[$idx][0]; } } return $img_id; } add_action('the_post', 'autoset_featured'); add_action('save_post', 'autoset_featured'); add_action('draft_to_publish', 'autoset_featured'); add_action('new_to_publish', 'autoset_featured'); add_action('pending_to_publish', 'autoset_featured'); add_action('future_to_publish', 'autoset_featured'); 

Solutions Collecting From Web of "Случайное изображение на основе категории"

Прежде всего, когда вы вызываете функцию get_image пропустите категории сообщений в качестве параметра.

Отредактируйте autoset_featured функции autoset_featured

 ... } else { set_post_thumbnail($post->ID, get_image()); } ... 

с:

 ... } else { $cat_slugs = wp_get_post_terms($post->ID, 'event-categories', array("fields" => "slugs")); $image = get_image( $cat_slugs ); if ( image ) set_post_thumbnail($post->ID, $image); } ... 

Затем отредактируйте get_image примерно так:

 function get_image( $cats = array() ) { $media_query = new WP_Query( array( 'post_status' => 'inherit', 'post_parent' => 0, 'post_type' => 'attachment', 'post_mime_type' => 'image/jpeg', // set 'orderby' to 'rand' will randomize results order 'orderby' => 'rand', // READ CAREFULLY: // if in the title of all images intended to be used as thumbnail // you put something that contain 'UF' you can use the 's' param // retrieving less results and so improving performance // in that case uncomment next line // 's' => 'UF' ) ); if ( $media_query->have_posts() ) { $lastid = false; // just an early setup // loop through images foreach ($media_query->posts as $post) { // get current image url $fullpath = wp_get_attachment_url($post->ID); // if current image name doesn't start with 'UF-' skip it if ( strpos( basename($fullpath), 'UF-' ) !== 0 ) continue; // if the original post has no categories assigned, return first image ID // images are random ordered, so first one is random one if ( empty($cats) ) return $post->ID; // get current image file name (without extension) and remove the 'UF-' part $name = pathinfo( basename($fullpath), PATHINFO_FILENAME); $nameNoUF = str_replace('UF-', '', $name); // $nameNoUF contain something like 'category-name-01' // because 'UF-' at beginning and extension were both removed // save the current image ID in a helper variable for future possible use $lastid = $post->ID; // loop through categories and if $nameNoUF start with a category slug, // return the image ID. // this way every image named like 'UF-category-name-01.jpg' match foreach ( $cats as $cat ) { if ( strpos($nameNoUF, $cat) === 0 ) return $post->ID; } } // if we are here no category related image was found, so return the last image ID // images are random ordered, so last one is random one return $lastid; } // no images found at all, sorry, return false (no thumbnail will be setted) return false; } 

Как было предложено во встроенных комментариях использовать параметр s в запросе для получения изображений с «UF» в заголовке или контенте для ограничения результатов. Конечно, вам нужно добавить эту строку в заголовок или контент изображения.

Встроенные комментарии должны объяснять, как работает эта функция.

Надеюсь, поможет.