Este sanitize_title suficient pentru generarea slug-urilor pentru articole?

6 iul. 2011, 17:27:29
Vizualizări: 28.2K
Voturi: 30

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.

0
Toate răspunsurile la întrebare 4
4
32

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

6 iul. 2011 18:03:26
Comentarii

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...

Tim Malone Tim Malone
24 iul. 2015 05:31:55

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.

JHoffmann JHoffmann
26 aug. 2015 11:43:25

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

GDY GDY
27 feb. 2019 17:01:52

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

Tyler Collier Tyler Collier
12 iun. 2024 23:18:19
1
14

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.

20 feb. 2018 12:25:23
Comentarii

Acesta ar trebui să fie răspunsul corect

bysanchy bysanchy
23 iul. 2018 11:14:52
0

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.

10 ian. 2017 14:58:22
0

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.

30 iul. 2018 18:53:10