Este sanitize_title suficient pentru generarea slug-urilor pentru articole?
Doresc să generez slug-uri pentru anumite șiruri de caractere fără a trece prin fluxul de generare de slug-uri din WordPress. Prin urmare, vreau să știu ce funcții sunt apelate pentru a obține un slug curat. Am încercat sanitize_title() dar lasă %c2 %a0 în rezultat.

Aproape ai ajuns. Funcția de care ai nevoie este sanitize_title_with_dashes( $title )

Deși acest lucru pare cu siguranță corect, sunt puțin neclar ce face diferit sanitize_title_with_dashes în comparație cu sanitize_title. sanitize_title de asemenea adaugă liniuțe acolo unde există spații albe...

Dacă verifici WordPress Codex pentru sanitize_title_with_dashes( $title ), vei vedea nota 'nu înlocuiește caracterele speciale cu accent' ceea ce înseamnă că caractere precum èäç
etc. vor rămâne la locul lor cu această funcție.

Te rog să notezi că atât sanitize_title_with_dashes
cât și sanitize_title
lasă unele caractere speciale care pot cauza probleme în unele sisteme. Dacă dorești o abordare mai universală în reducerea șirurilor, aruncă o privire la sanitize_html_class

Acest răspuns este incorect, așa cum s-a explicat în comentarii, iar autorul ar trebui să îl actualizeze, poate cel mai bine prin trimiterea către un răspuns mai corect precum https://wordpress.stackexchange.com/a/294587/27896

sanitize_title()
pare să fie singura funcție de care ai nevoie.
În fișierul wp-includes/default-filters.php la linia 211 vei găsi:
add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);
Aceasta înseamnă că apelarea funcției sanitize_title()
va elimina mai întâi toate caracterele speciale, apoi va aplica filtrul sanitize_title
, apelând astfel funcția sanitize_title_with_dashes()
După cum a menționat @JHoffmann, simpla apelare a funcției sanitize_title_with_dashes()
nu va elimina caracterele speciale.

Ei bine, există deja un răspuns, dar am vrut să-l extind puțin, așa că iată constatările mele:
Dacă ne uităm în wp_insert_post()
, vedem că $post_name
este sanitizat folosind wp_sanitize_title()
(vezi wp-includes/post.php
).
În funcția sanitize_title()
avem un filtru sanitize_title
. Acesta este interesant, deoarece în filtrele implicite, sanitize_title_with_dashes()
este atașat la acest filtru (vezi wp-includes/default-filters.php
).
<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>
Am încercat sanitize_title() dar lasă %c2 %a0 în rezultat.
Acest lucru sună ciudat. Ar fi util să știm valoarea de intrare, dar urmând wp_insert_post()
, sanitize_title()
pare să fie suficient.

Pe lângă răspunsul excelent al lui websupporter, am descoperit următoarele:
În funcție de utilizarea dvs., va depinde ce aveți nevoie.
sanitize_title()
așa cum spune:
accentele sunt eliminate (caracterele accentuate sunt înlocuite cu echivalente neaccentuate)
...iar sanitize_title_with_dashes
spune:
Rețineți că nu înlocuiește caracterele accentuate speciale
Deci, cu acest șir exemplu: Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç
Rezultatul sanitize_title()
:
aa-o-sa-%20-oo-pp-_-eac
După cum puteți vedea, a înlocuit caracterele accentuate cu echivalentele lor neaccentuate și a eliminat toate celelalte caractere non-alfanumerice, cu excepția %
care este urmat de un număr, dar veți observa că a fost eliminat când era urmat de o literă; poate pentru că le percepe ca fiind deja codificate. Acest lucru este confirmat atunci când încercați să introduceți %c3
în șirul dvs., nu îl elimină deoarece %c3
este o secvență validă de codificare.
Rezultatul sanitize_title_with_dashes
:
%c3%a2%c3%a4-%c3%b6-%c3%9f%c3%a1-%20-oo-pp-_-%c3%a8%c3%a4%c3%a7
Deci, după cum puteți vedea, nu a eliminat caracterele accentuate, ci le-a codificat.
Acum să analizăm un șir fără caractere accentuate pentru a vedea cum se comportă ambele...
Șir exemplu: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'
Rezultatul sanitize_title()
:
building-%20-oo-pp-_
Rezultatul sanitize_title_with_dashes
:
building-%20-oo-pp-_
Deci, după cum puteți vedea, sunt exact la fel. Se pare că singura diferență între ele este că una codifică caracterele accentuate, în timp ce cealaltă le înlocuiește.
