Skip to content

Instantly share code, notes, and snippets.

@chaushevic
Last active October 4, 2018 14:33
Show Gist options
  • Save chaushevic/14445cce21a8d0516026f8a714b6fb08 to your computer and use it in GitHub Desktop.
Save chaushevic/14445cce21a8d0516026f8a714b6fb08 to your computer and use it in GitHub Desktop.
Allow saving URL with dots in WordPress
<?php
// Remove and copy over default sanitize_title_with_dashes functionality and add dot as allowed character
remove_filter( "sanitize_title", "sanitize_title_with_dashes", 10 );
add_filter( "sanitize_title", function($title, $raw_title = "", $context = "display") {
$title = strip_tags($title);
// Preserve escaped octets.
$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
// Remove percent signs that are not part of an octet.
$title = str_replace('%', '', $title);
// Restore octets.
$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $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);
if ( 'save' == $context ) {
// Convert nbsp, ndash and mdash to hyphens
$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
// Convert nbsp, ndash and mdash HTML entities to hyphens
$title = str_replace( array( '&nbsp;', '&#160;', '&ndash;', '&#8211;', '&mdash;', '&#8212;' ), '-', $title );
// Convert forward slash to hyphen
$title = str_replace( '/', '-', $title );
// Strip these characters entirely
$title = str_replace( array(
// iexcl and iquest
'%c2%a1', '%c2%bf',
// angle quotes
'%c2%ab', '%c2%bb', '%e2%80%b9', '%e2%80%ba',
// curly quotes
'%e2%80%98', '%e2%80%99', '%e2%80%9c', '%e2%80%9d',
'%e2%80%9a', '%e2%80%9b', '%e2%80%9e', '%e2%80%9f',
// copy, reg, deg, hellip and trade
'%c2%a9', '%c2%ae', '%c2%b0', '%e2%80%a6', '%e2%84%a2',
// acute accents
'%c2%b4', '%cb%8a', '%cc%81', '%cd%81',
// grave accent, macron, caron
'%cc%80', '%cc%84', '%cc%8c',
), '', $title );
// Convert times to x
$title = str_replace( '%c3%97', 'x', $title );
}
$title = preg_replace('/&.+?;/', '', $title); // kill entities
// Stop converting dot to dash
//$title = str_replace('.', '-', $title);
$title = preg_replace('/[^%a-z0-9 ._-]/', '', $title); // Allow dot when removing invalid chars
$title = preg_replace('/\s+/', '-', $title);
$title = preg_replace('|-+|', '-', $title);
// Allowing the following two rules below will break any current page which has multiple dots or dashes around dots
// Ex. /log-.-in/ /log...in/ /log---.in/ will all become 404 links
$title = preg_replace( "/[-]*[.][-]*/", ".", $title ); // Disallow dash(es) around dot
$title = preg_replace( "/[.]+/", ".", $title ); // Disallow multiple dots in succession
$title = trim($title, '-.'); // Also trim leading and trailing dot(s)
return $title;
}, 10, 3 );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment