Что имеем:
Тип записи «продукты» — product
Произвольное поле «картинка» — product_image

Задача:
Вывести одну случайную картинку из всех продуктов

Решение:

Код:

function random_image($type = 0){
    $args = array(
        'post_type' => 'product',
        'order' => 'ASC',
        'posts_per_page' => -1
    );
    
    // получаем все продукты
    $posts = get_posts( $args );

    // создаем массив ID всех продуктов
    foreach( $posts as $pst ){
        $input[] = $pst->ID;
    }

    //выводим случайный ключ массива
    $rand_keys = array_rand($input, 1);

    //получаем урл картинки по полученному значению произвольного поля
    return wp_get_attachment_image_url(get_post_meta($input[$rand_keys], 'product_image', true), full);
}
Обновленная версия

Код:

function random_field_post($type = 0, $post_type, $cust_field){
    $args = array(
        'post_type' => $post_type,
        'order' => 'ASC',
        'posts_per_page' => -1
    );

    $posts = get_posts( $args );

    // создаем массив со всеми продуктами
    foreach( $posts as $pst ){
        $input[] = $pst->ID;
    }

    //выводим случайный ключ массива
    $rand_keys = array_rand($input, 1);

    if( $type = 1 ){
        $post = get_post( $input[$rand_keys], ARRAY_A, 'display' );
        $post[$cust_field] = wp_get_attachment_image_url(get_post_meta($input[$rand_keys], $cust_field, true), full);
        $post['url'] = get_the_permalink ( $input[$rand_keys] );
        $post['post_content'] = apply_filters( 'the_content', $post['post_content'] );

        return $post;
    }else{
        //получаем урл картинки по полученному значению произвольного поля
        return wp_get_attachment_image_url(get_post_meta($input[$rand_keys], $cust_field, true), full);
    }
}

Теперь мы можем передавать три параметра:
1. Тип вывода:

  • 0 — вывести заданное нам произвольное поле.
  • 1 — вывести весь пост плюс наше поле.

2. Тип записи.
3. Название нашего произвольного поля.

Пример:

Код:

<?php
$random =  random_field_post(1, 'product', 'product_image');
echo $random['post_title'] . '<br>';
echo $random['product_image'] . '<br>';
?>
ID(число)
Идентификатор записи.

post_author(число)
Идентификатор автора записи.

post_date(строка)
Дата записи в формате YYYY-MM-DD HH:MM:SS (с учетом исправления времени).

post_date_gmt(строка)
Дата записи в формате YYYY-MM-DD HH:MM:SS (время по Гринвичу (GMT)).

post_content(строка)
Текст записи.

post_title(строка)
Заголовок записи.

post_excerpt(строка)
Цитата записи.

post_status(строка)
Статут записи, может быть: publish|pending|draft|private|static|object|attachment|inherit|future|trash.

comment_status(строка)
Возможность комментирования для записи, может быть: open|closed|registered_only.

ping_status(строка)
Статус пингов/трэкбэков, может быть: open|closed.

post_password(строка)
Пароль записи.

post_name(строка)
Имя записи (слаг). Название которое обычно используется в УРЛ-е.

to_ping(строка)
УРЛ-ы из статьи, на которые нужно отправить уведомления при обновлении поста.

pinged(строка)
УРЛ-ы из статьи, которые уже получили уведомления.

post_modified(строка)
Дата изменения записи в формате YYYY-MM-DD HH:MM:SS (с учетом корректировки времени).

post_modified_gmt(число/строка)
Дата изменения записи в формате YYYY-MM-DD HH:MM:SS (время по Гринвичу (GMT)).

post_parent(число)
ID родительской страницы (отлично от нуля у прикрепленных типов записей).

guid(строка)
Ссылка на запись. Важно: использовать этот параметр в качестве постоянной ссылки для поста неправильно, если версия вашего WordPress выше 2.5. Это уникальный идентификатор записи, который позднее стал ссылкой на запись.

menu_order(число)
Порядковый номер для построения меню (используется для постоянных страниц).

post_type(строка)
Тип записи (post|page|attachment).

post_mime_type(строка)
Миме тип записи (jpg|png|zip|pdf и т.д.). Используется для прикрепленных записей.

comment_count(число)
Количество комментариев у записи.