web-dev-qa-db-fra.com

Comment générer automatiquement une limace aléatoire

J'ai essayé de créer une fonction qui génère un slug aléatoire lorsqu'un message est créé. Je suis un peu inquiet que la fonction génère des chaînes non uniques comme des slugs. Comment puis-je résoudre ça?

La fonction ressemble à:

add_filter('name_save_pre','unique_slug', 0);

function random_string() {
    $length = 6;
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
    $string = '';    
    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_Rand(0, strlen($characters))];
    }
    return $string;
}

function unique_id($slug) {
    global $wpdb;

    return $wpdb -> get_row("SELECT ID FROM wp_post WHERE post_name = '" . $slug . "' && post_status = 'publish' && post_type = 'post'");   
}

function unique_slug($slug) {
    if($slug) return $slug;

    $random_slug = random_string();
    if(!unique_id($random_slug)){
        //what to do here?
    }
    else {
        return $random_slug;
    }
}
4
Erikm

J'ai trouvé ce plugin qui devrait faire l'affaire: http://wordpress.org/extend/plugins/wp-hashed-ids/

2
Erikm

Utilisez la fonction wp_unique_post_slug() . Ne réinventez pas la roue, celle-ci est assez délicate.

Usage:

$unique_slug = wp_unique_post_slug( 
    $slug,
    $post_ID, 
    $post_status,
    $post_type, 
    $post_parent 
);

Ensuite, vous pouvez tester si $slug === $unique_slug et en générer un nouveau si le test échoue.

Vous pouvez trouver la fonction dans wp-includes/post.php. Il se termine par un filtre 'wp_unique_post_slug'. Vous pouvez donc toujours ajuster la valeur de retour si vous ne l’aimez pas.

5
fuxia