web-dev-qa-db-fra.com

Comment générer des slugs numériques aléatoires pour un type de post personnalisé?

J'ai ce code PHP pour générer une chaîne numérique aléatoire:

function generateRandomString($length = 12)
{
    global $generatedStrings;
    $characters = '0123456789';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[Rand(0, strlen($characters) - 1)];
    }
    if (isset($generatedStrings[$randomString])) {
        $randomString = generateRandomString($length);
    }
    $generatedStrings[$randomString] = $randomString;
    return $randomString;
}

$generatedStrings = array();

foreach(range(1, 100000) as $num) {
    echo "\n".$num."\t : ".generateRandomString();
}

Je me demandais si quelqu'un pourrait nous aider à comprendre comment intégrer ce code avec WordPress afin de générer automatiquement des chaînes en tant que slugs pour un type de publication personnalisé.

Toute orientation que vous pouvez fournir est appréciée!

2
rey
function wpse_18293_get_random_string ($number_of_chars_to_use)  {

    $upper_case_charachters = range('A', 'Z');

    while($cnt < $number_of_chars_to_use) {
        $random_string.= $upper_case_charachters[mt_Rand(0,    count($upper_case_charachters)-1)];
        $cnt++;
    } 
    return $random_string
}

$random_string = wpse_18293_get_random_string('10');

Le "10" peut être n'importe quel nombre et la fonction renverra une chaîne de caractères aléatoires longs. Notez que le nom de la fonction peut être ce que vous voulez, j'ai nommé est en tant que tel pour éviter les conflits de nom de fonction.

ce que cela fait, c'est itérer $ number_of_chars_to_use nombre de fois, chaque boucle sélectionne un caractère aléatoire de $ uppser_case_charachters et l'ajoute à une chaîne. Voilà, chaîne de caractères aléatoire instantanée.

Il est à noter que $ upper_case_charachters n'est qu'un tableau rempli d'alphabet. Si vous vouliez des nombres, vous pouvez facilement échanger la plage ('0', '9');

1
Hybrid Web Dev

Voici un exemple pour générer automatiquement des slugs numériques, autres que les ID de publication:

/**
 * Auto generate numeric slugs for a given custom post type (via post.php screen)
 * Requires PHP 5.3+
 * @see http://wordpress.stackexchange.com/a/169907/26350
 */
add_action( 'load-post.php', function(){
    add_filter( 'wp_insert_post_data', function( $data, $postarr ) {
        if(
            'post' === $data['post_type']   // <-- Edit the cpt to your needs!
            && empty( $data['post_name'] )
            && isset( $postarr['post_ID'] )
            && $postarr['post_ID'] * 1 > 0
        )
        {
            //----------------------------------
            // Method with post ID reference (not random):
            //
            $data['post_name'] = sprintf( '%u', crc32( $postarr['post_ID'] ) );

            //----------------------------------
            // Method without post ID reference (random):
            //                 
            // $data['post_name'] = Rand( 10000000, 99999999 );        
        }
        return $data;
    }, 10, 2 );
});

où vous pouvez modifier le type de message en fonction de vos besoins.

Ceci se déclenche sur l'écran post.php et non sur l'écran post-new.php.

Vous pouvez facilement tester les collisions de la fonction crc32() PHP, pour les ID de poste compris entre 1 et 100 000, en utilisant le script de cette answer . Je l'ai testé jusqu'à un million sans aucune collision.

Notez que si quelque chose d'inattendu se produisait, que vous générez un slug précédent, WordPress s'en occupera comme d'habitude via la fonction wp_unique_post_slug().

J'espère que vous pourrez adapter cela à vos besoins.

0
birgire