以下の関数を使用して、ランダムな一意の6桁の番号を作成し、それをカスタムの投稿タイプのメタフィールドに保存します。
Whileループ内でのrewind_posts()
の使用についてはよくわかりません。これは、既存のカスタム投稿の中に$random
番号がすでに存在するかどうかを確認するという考え方です。存在する場合は、新しい乱数を生成し、すべてのカスタム投稿に対して再度確認します。
function create_random_unique_id() {
// Create random 6 digit number
$random = substr( Rand() * 900000 + 100000, 0, 6 );
// Get all Custom Posts
$args = array( 'post_type' => 'my_custom_post_type', 'posts_per_page' => -1 );
$loop = new WP_Query( $args );
// For each Custom Post, check if $random matches $cpt_id
while ( $loop->have_posts() ) {
$loop->the_post();
$cpt_id = get_post_meta ( get_the_id(), 'id', true );
// If $random matches $subscriber_id assign a different random 6 digit number
if ( $cpt_id == $random ) {
$random = substr( Rand() * 900000 + 100000, 0, 6 );
rewind_posts();
}
}
return $random;
}
これはあなたがしていることと非常に高価な操作であり、私見でも間違ったワークフローです。あなたがやりたいことは、次のとおりです
必要な特定のmeta_value
からすべてのmeta_key
を取得します。
特定のmeta_key
から返された値に対して乱数をチェックすることができます
これがコードの基本的な考え方です。( pwdtechnology.comのChinmoy Paul氏のコードです。コードはわかりやすいようにコメントされています )
以下はfunctions.php
に入ります
/**
* Description: Getting all the values associated with a specific custom post meta key, across all posts
* Author: Chinmoy Paul
* Author URL: http://pwdtechnology.com
*
* @param string $key Post Meta Key.
*
* @param string $type Post Type. Default is post. You can pass custom post type here.
*
* @param string $status Post Status like Publish, draft, future etc. default is publish
*
* @return array
*/
function get_unique_post_meta_values( $key = '', $type = 'post', $status = 'publish' )
{
global $wpdb;
if( empty( $key ) )
return;
$res = $wpdb->get_col(
$wpdb->prepare(
"SELECT DISTINCT pm.meta_value
FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p
ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'",
$key,
$status,
$type
)
);
return $res;
}
さて、特定のmeta_key
とpost_type
から与えられたpost_status
からメタ値の特定の配列を得るために、あなたは以下を試みることができます:
// Get ids to exclude
$ids_to_exclude = get_unique_post_meta_values(
'id', // This is our meta_key to get values from
'MY_POST_TYPE', // This is the name of your custom post type
'POST_STATUS' // Any other post status except publish as publish is default
);
/**
* Generate a unique id
* Thanks to Gautam3164 for the code
* @see http://stackoverflow.com/a/17109530/1908141
*/
do {
// This is taken as is from your code in question
$random = substr( Rand() * 900000 + 100000, 0, 6 );
}
while( in_array( $random, $ids_to_exclude ) );
echo $random;
あなたは1つの完全に機能的な機能にすべてをまとめることができます。
/**
* Description: Get a random unique 6 number id for any given meta_key
*
* @param string $key Post Meta Key.
*
* @param string $type Post Type. Default is post. You can pass custom post type here.
*
* @param string $status Post Status like Publish, draft, future etc. default is publish
*
* @return array
*/
function get_unique_random_value(
$key = '',
$type = 'post',
$status = 'publish'
) {
global $wpdb;
// Check if we have a meta_key before continuing, if not, return false
if( empty( $key ) )
return false;
$res = $wpdb->get_col(
$wpdb->prepare(
"SELECT DISTINCT pm.meta_value
FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p
ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'",
$key,
$status,
$type
)
);
// Check if we actually have an array of values, if not, return false
if ( !$res )
return false;
/**
* Generate a unique id
* Thanks to Gautam3164 for the code
* @see http://stackoverflow.com/a/17109530/1908141
*/
do {
// This is taken as is from your code in question
$random = substr( Rand() * 900000 + 100000, 0, 6 );
}
while( in_array( $random, $res ) );
return $random;
}
それならあなたはそれを次のように使うことができます
$random_id = get_unique_random_value (
'id', // This is our meta_key to get values from
'MY_POST_TYPE', // This is the name of your custom post type
'POST_STATUS' // Any other post status except publish as publish is default
);
echo $random_id;