web-dev-qa-db-fra.com

Créer automatiquement un joli lien permanent pour un tas de messages

J'ai spammé de nombreux messages en double à partir d'une première et maintenant, après les avoir modifiés, la structure de leur URL ressemble à http://example.com/base-name-copy-20, où base-name est le slug de la publication initiale dupliquée. Je sais maintenant que je pourrais modifier manuellement le lien permanent pour chacun d’entre eux, mais existe-t-il un moyen de créer à nouveau un slug pour ces posts dupliqués? Je les ai éditées pour qu'elles aient toutes leur propre titre maintenant, mais le permalien est déjà défini. Si je pouvais réaffecter les permaliens de la même manière que wordpress leur donne automatiquement une limace, ce serait bien.

Merci d'avance !

1
George Dimitriadis

Après avoir trouvé des sources intéressantes, je me suis retrouvé avec cette solution (une fonction supplémentaire permettant de gérer quelques caractères néerlandais):

drop function if exists fn_remove_accents;
delimiter |
create function fn_remove_accents( textvalue varchar(20000) )
returns varchar(20000)
begin

set @textvalue = textvalue;

-- ACCENTS
set @withaccents = 'ŠšŽžÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝŸÞàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿþƒ';
set @withoutaccents = 'SsZzAAAAAAACEEEEIIIINOOOOOOUUUUYYBaaaaaaaceeeeiiiinoooooouuuuyybf';
set @count = length(@withaccents);

while @count > 0 do
    set @textvalue = replace(@textvalue, substring(@withaccents, @count, 1), substring(@withoutaccents, @count, 1));
    set @count = @count - 1;
end while;

-- SPECIAL CHARS
set @special = '!@#$%¨&*()_+=§¹²³£¢¬"`´{[^~}]<,>.:;?/°ºª+*|\\''';
set @count = length(@special);
while @count > 0 do
    set @textvalue = replace(@textvalue, substring(@special, @count, 1), '');
    set @count = @count - 1;
end while;

return @textvalue;

end
|

DROP FUNCTION IF EXISTS `slugify`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` # I have no idea what this does
FUNCTION `slugify`(dirty_string varchar(200))
RETURNS varchar(200) CHARSET latin1
DETERMINISTIC
BEGIN
    DECLARE x, y , z Int;
    Declare temp_string, allowed_chars, new_string VarChar(200);
    Declare is_allowed Bool;
    Declare c, check_char VarChar(1);

    set allowed_chars = "abcdefghijklmnopqrstuvwxyz0123456789-";
    set temp_string = fn_remove_accents(LOWER(dirty_string));
    Select temp_string Regexp('&') Into x;
    If x = 1 Then
        Set temp_string = replace(temp_string, '&', ' and ');
    End If;

    Select temp_string Regexp('[^a-z0-9]+') into x;
    If x = 1 then
        set z = 1;
        While z <= Char_length(temp_string) Do
            Set c = Substring(temp_string, z, 1);
            Set is_allowed = False;
            Set y = 1;
            Inner_Check: While y <= Char_length(allowed_chars) Do
                If (strCmp(ascii(Substring(allowed_chars,y,1)), Ascii(c)) = 0) Then
                    Set is_allowed = True;
                    Leave Inner_Check;
                End If;
                Set y = y + 1;
            End While;
            If is_allowed = False Then
                Set temp_string = Replace(temp_string, c, '-');
            End If;

            set z = z + 1;
        End While;
    End If;

    Select temp_string Regexp("^-|-$|'") into x;
    If x = 1 Then
        Set temp_string = Replace(temp_string, "'", '');
        Set z = Char_length(temp_string);
        Set y = Char_length(temp_string);
        Dash_check: While z > 1 Do
            If Strcmp(SubString(temp_string, -1, 1), '-') = 0 Then
                Set temp_string = Substring(temp_string,1, y-1);
                Set y = y - 1;
            Else
                Leave Dash_check;
            End If;
            Set z = z - 1;
        End While;
    End If;

    Repeat
        Select temp_string Regexp("--") into x;
        If x = 1 Then
            Set temp_string = Replace(temp_string, "--", "-");
        End If;
    Until x <> 1 End Repeat;

    Return temp_string;
END;;
DELIMITER ;

UPDATE wp_posts SET post_name = slugify(post_title) WHERE post_name LIKE '%copy%' AND post_type = 'MY_POST_TYPE';

Explication de la requête: Les deux premières fonctions proviennent directement des sources 1 et 2, avec une petite édition permettant de gérer également les caractères majuscules.

Enfin, la requête de mise à jour correspond aux publications dupliquées dont le slug contient Word copy, mais selon votre cas, vous souhaiterez probablement rendre cette règle plus stricte. Je souhaite exécuter cette requête sur mon type de publication personnalisé. J'ai donc ajouté une vérification supplémentaire pour le type de publication sur la requête, ce qui n'est pas grave.

Un nouveau slug sera attribué aux messages correspondants en fonction de leur titre (post_title). Vous pouvez également spécifier une source différente pour la génération du slug.

Sources:

[1] Remplace les caractères non latins de manière sélective

[2] Régénérez un slug à partir d'un nom en texte libre

[3] Réponse de WebElaine (sur cette page)

1
George Dimitriadis

Editer manuellement le permalien serait l’itinéraire le plus sûr. Si vous êtes habitué à utiliser phpMyAdmin, vous pouvez créer une requête MySQL pour les mettre à jour en une fois. Un peu plus de travail que l'attribution automatique d'une limace, mais cela ne nécessite pas beaucoup de codage pour essayer de recalculer les limaces.

update wp_posts SET post_name = 'new-slug' WHERE post_name = 'old-slug';

(Vous pouvez copier et coller ceci sur plusieurs lignes et en mettre à jour autant que vous le souhaitez en une seule opération.)

1
WebElaine