Я думаю, что это работает. Обратите внимание, что, как написано, он будет соответствовать каждому «apple.», «Dell.» И «microsoft». ссылки в каждом типе контента, который использует фильтр контента - посты, страницы, выдержки, множество пользовательских типов постов и т. д. c. - так что, если вы на самом деле этого не хотите, а вы вполне можете этого не делать, тогда необходимо заменить основную функцию замены, а функцию регулярного выражения - более точно нацелить ... и это может стать сложным.
(Кроме того, если подумать, я не уверен, что кавычки в тегах привязки, которые Regex найдет, потребуют специальной обработки. Если это не сработает, мы тоже можем посмотреть на это Или, может быть, переключиться на анализатор DOM, как, может быть, мне следовало начать с выполнения ...)
/** INITIATE FILTER FUNCTION **/
add_filter( 'the_content', 'wpso_change_urls' ) ;
/**
* PREG CALLBACK FUNCTION
* Match Matches to id #s
* and return replacement urls enclosed in quotes (as found)
*/
function wpso_found_urls( $matches ) {
//someone else probably has a v clever parsimonious way to do this next part
//but at least this makes what's happening easy to read
if ( strpos( $matches[0], 'apple' ) ) {
$id = '1234' ;
}
if ( strpos( $matches[0], 'microsoft' ) ) {
$id = '5678' ;
}
if ( strpos( $matches[0], 'dell' ) ) {
$id = '9876' ;
}
$raw_url = trim( $matches[0], '"' ) ;
return '"https://www.network.com/promotion/click/id='. $id .'-yxz?param0='.rawurlencode( $raw_url) . '"' ;
}
/** ENDURING A DREADFUL FATE USING REGEX TO PARSE HTML **/
function wpso_change_urls( $content ) {
$find_urls = array(
'/"+(http|https)(\:\/\/\S*apple.\S*")/',
'/"+(http|https)(\:\/\/\S*microsoft.\S*")/',
'/"+(http|https)(\:\/\/\S*dell.\S*")/',
);
return preg_replace_callback( $find_urls, 'wpso_found_urls', $content ) ;
}
Возврат (примечание: пример перед обрезкой кавычек из «сырого URL» перед кодированием):
... из оригинального (постредактор) контента, подобного этому: