Come posso creare permalink con lettere maiuscole?
Come posso creare un link come questo?
http://www.lifecellskin.us/Dev/About
la parte "Using_Permalinks", la A è in maiuscolo. Ma WordPress converte automaticamente le maiuscole in minuscole.
Sto cercando di convertire un vecchio sito fatto solo in HTML in una piattaforma WordPress. Alcuni link del sito sono così:
http://www.lifecellskin.us/About
Il sito è già indicizzato per il SEO. Quindi non voglio perdere il ranking nei motori di ricerca.
Grazie per aver letto questo, e spero che qualcuno possa far luce sulla questione...

Gli URL delle pagine sono definiti dagli slug, e per impostazione predefinita vengono formattati e convertiti in minuscolo dalla funzione sanitize_title_with_dashes()
. Tuttavia, questa funzione viene chiamata tramite un filtro, ed è possibile rimuovere l'hook del filtro in modo che non venga eseguita:
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
Fare solo questo probabilmente non è una buona idea, poiché non rimuoverà gli spazi e altri caratteri strani nello slug. Suggerisco di copiare la funzione esistente, rimuovere la parte che converte in minuscolo e riattivarla nuovamente:
add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes' );
function wpse5029_sanitize_title_with_dashes($title) {
$title = strip_tags($title);
// Conserva gli ottetti escapati
$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
// Rimuove i segni di percentuale che non fanno parte di un ottetto
$title = str_replace('%', '', $title);
// Ripristina gli ottetti
$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);
$title = remove_accents($title);
if (seems_utf8($title)) {
//if (function_exists('mb_strtolower')) {
// $title = mb_strtolower($title, 'UTF-8');
//}
$title = utf8_uri_encode($title, 200);
}
//$title = strtolower($title);
$title = preg_replace('/&.+?;/', '', $title); // rimuove le entità
$title = str_replace('.', '-', $title);
// Conserva anche i caratteri maiuscoli!
$title = preg_replace('/[^%a-zA-Z0-9 _-]/', '', $title);
$title = preg_replace('/\s+/', '-', $title);
$title = preg_replace('|-+|', '-', $title);
$title = trim($title, '-');
return $title;
}

solo una stupida domanda, perché anteponi wpse{qualsiasinumero} alle tue funzioni?

@Horttcore: wpse5029 come la domanda #5029 su WP Stack Exchange?

@Horttcore: Esatto, aggiungo il numero della domanda come prefisso a tutti i nomi delle funzioni. Per provarle io stesso come plugin separati, e nel caso qualcuno le copi nel proprio codice senza modificare: wpseNNNN
è probabilmente univoco.

Grazie per l'informazione. Sto cercando di far sì che Wordpress rispetti le maiuscole incluse nel nome utente, ma non ci riesco.

Raccomando vivamente di mantenere gli URL in minuscolo per il tuo sito come fa WordPress (considero che gli URL in minuscolo siano una best practice in ogni caso) ma di configurare reindirizzamenti 301 per tutti gli URL per i quali hai questo problema. Ho notato che di solito si finisce per avere problemi quando si cerca di contrastare una piattaforma per impedirle di fare ciò che vuole fare, e le strutture degli URL sono davvero integrate nell'architettura di WordPress.
Ho scritto un'altra risposta molto simile alle tue esigenze e quell'esempio può mostrarti come utilizzare l'hook 'template_redirect'
per impostare un reindirizzamento per quegli URL dove hai questo problema:
Se desideri ulteriori chiarimenti, chiedi pure.

Per quanto ne so, i motori di ricerca non sono sensibili alle maiuscole/minuscole, sebbene gli URL lo siano. Raccomanderei di eliminare il formato di file con le maiuscole, poiché è difficile da ricordare per gli utenti.
Se vuoi davvero mantenere la struttura precedente, dovrai lavorare con le espressioni regolari (regexp) nel file .htaccess.

FEBBRAIO 2020
Dalla risposta di Jan Fabry, la funzione WordPress è cambiata leggermente, quindi lo snippet corretto per la versione 5.6 è:
add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes', 10, 3 );
function wpse5029_sanitize_title_with_dashes($title, $raw_title, $context = 'display') {
$title = strip_tags( $raw_title );
// Preserva gli ottetti escapati.
$title = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title );
// Rimuove i segni di percentuale che non fanno parte di un ottetto.
$title = str_replace( '%', '', $title );
// Ripristina gli ottetti.
$title = preg_replace( '|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title );
if ( seems_utf8( $title ) ) {
$title = utf8_uri_encode( utf8_encode($title), 200 );
}
if ( 'save' === $context ) {
// Converti  , &ndash e &mdash in trattini.
$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
// Converti le entità HTML  , &ndash e &mdash in trattini.
$title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $title );
// Converti lo slash forward in trattino.
$title = str_replace( '/', '-', $title );
// Rimuovi completamente questi caratteri.
$title = str_replace(
array(
// Soft hyphens.
'%c2%ad',
// ¡ e ¿.
'%c2%a1',
'%c2%bf',
// Virgolette angolari.
'%c2%ab',
'%c2%bb',
'%e2%80%b9',
'%e2%80%ba',
// Virgolette curve.
'%e2%80%98',
'%e2%80%99',
'%e2%80%9c',
'%e2%80%9d',
'%e2%80%9a',
'%e2%80%9b',
'%e2%80%9e',
'%e2%80%9f',
// Punto elenco.
'%e2%80%a2',
// ©, ®, °, &hellip e &trade.
'%c2%a9',
'%c2%ae',
'%c2%b0',
'%e2%80%a6',
'%e2%84%a2',
// Accenti acuti.
'%c2%b4',
'%cb%8a',
'%cc%81',
'%cd%81',
// Accento grave, macron, caron.
'%cc%80',
'%cc%84',
'%cc%8c',
),
'',
$title
);
// Converti × in 'x'.
$title = str_replace( '%c3%97', 'x', $title );
}
// Elimina le entità.
$title = preg_replace( '/&.+?;/', '', $title );
$title = str_replace( '.', '-', $title );
$title = preg_replace( '/[^%a-zA-Z0-9 _-]/', '', $title );
$title = preg_replace( '/\s+/', '-', $title );
$title = preg_replace( '|-+|', '-', $title );
$title = trim( $title, '-' );
return $title;
}
L'editor continuerà a mostrare l'URL in minuscolo, ma lo avrà salvato esattamente come inviato, senza modificare le maiuscole.
Nota: potrebbe non essere una buona idea utilizzare questo tipo di funzione, poiché il formato minuscolo è più conveniente.

Puoi provare questo. Incolla il codice qui sotto nel file functions.php del tuo tema. Funziona perfettamente per me.
// Rimuovi il filtro esistente
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
// Funzione per mantenere le maiuscole negli slug
function maintain_capitalization_slug($title, $raw_title, $context) {
// Applica solo durante il salvataggio degli slug
if ($context === 'save') {
// Mantieni le maiuscole e sostituisci i caratteri speciali con trattini
$title = preg_replace('/[^a-zA-Z0-9]+/', '-', $raw_title); // Sostituisci caratteri non alfanumerici con trattini
$title = trim($title, '-'); // Rimuovi trattini all'inizio/fine
}
return $title;
}
// Applica la funzione personalizzata a 'sanitize_title'
add_filter('sanitize_title', 'maintain_capitalization_slug', 10, 3);
