Я хочу создать ссылку «Переслать другу» под сообщением в блоге, которое открывает мой почтовый клиент с готовым сообщением. Я могу заставить его работать для однострочного сообщения, но я хотел бы иметь возможность разбивать строки внутри тела сообщения. Как я могу это сделать?
<?php
printf(
'<a href="mailto:?subject=%s&body=%s">Forward this to a friend</a>',
the_title_attribute('echo=0'),
sprintf('The link: %s Have a great day! Stefaan', get_the_permalink())
);
?>
Как мне начать «Удачного дня!» На новой строке с пустой строкой выше?
Ссылка: …
Хорошего дня!
Stefaan
Мой блог использует WordPress с темой Genesis, и я поместил свой код в genesis_footer_entry
подключить с включенным PHP (см. Скриншот — текст письма на голландском языке).
Вы не можете использовать теги HTML в тело из MAILTO
В соответствии с RFC 2368, это невозможно:
Специальное hname «body» указывает, что ассоциированное hvalue является
Тело сообщения. Hname «body» должно содержать содержимое для
первая текстовая / обычная часть сообщения. URL-адрес mailto
в первую очередь предназначен для генерации коротких текстовых сообщений, которые
фактически содержимое автоматической обработки (например, «подписка» на сообщения для списков рассылки), а не общие тела MIME.
Поэтому любое решение, зависящее от тегов HTML, невозможно.
Решение, которое я предлагаю, это использовать \ Г \ п наряду с функцией PHP rawurlencode
Так вот код
<?php
printf(
'<a class="simple-mail-link" href="mailto:x@y.com?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
'My Subject',
rawurlencode(sprintf( "Hi there, this might be interesting for you.\r\nThis is the link: %s.\r\nHave a great day!\r\nStefaan", get_the_permalink()))
);
?>
Примечание: я пробовал код с заменой get_the_permalink () с переменным ношением http://example.com/test.php
Рекомендации:
Что является эквивалентом JavaScript encodeURIcomponent в PHP?
объяснение
a mailto:
Схема URI для адреса электронной почты, как и все другие URI, символы должны быть переведены в формат, который может быть передан через Интернет.
Возьмите упрощенную форму вашего исходного кода, чтобы проиллюстрировать пункты ниже
printf(<href="mailto:?subject=%s&body=%s">Description</a>, the_title_attribute( 'echo=0' ) , sprintf("content link:%s more content", get_the_permalink())
Код выполняется в следующих последовательностях
get_the_permalink()
получает URL вашей страницы sprintf()
заменяет %s
в $content
с результатом шага 1print_f()
затем заменяет%s
то есть subject=%s
с извлеченным результатом the_title_attribute( 'echo=0' )
что я предполагаю%s
то есть body=%s
с результатом шага 2, чтобы сформировать полный a mailto
ссылка на сайтЧтобы сохранить разрывы строк, вы должны преобразовать $content
строка в URL-кодированную форму перед выводом.
В PHP это делается с помощью rawurlencode()
функция, переводит переносы строк \r\n
в строке в %0D%0A
, согласно RFC 3986.
Поскольку знак процента %
используется для спецификации преобразования в sprint_f()
, вы должны передать строку rawurlencode()
после того, как строка была отформатирована sprint_f()
Поэтому использование rawurlencode(sprint_f($string, $arg))
Решение
Я собрал полное решение для вас, чтобы вы скопировали и вставили в ваш виджет, чтобы избежать ложного негатива из-за неправильной реализации.
Формат 1 и формат 2 содержат, по сути, один и тот же код, два формата служат для иллюстрации того, как можно вставить разрыв строки, либо на 1) pressing enter
ИЛИ 2) typing in \r\n
где разрыв строки необходим.
я сделал $content
отдельная строка для вашего удобства редактирования и читабельности кода.
Формат 1
<?php
//Start new line by pressing enter
//IMPORTANT NOTE: do not remove the %s
$content="Hi there, this might be interesting for you
This is the link: %s
Have a great day!
Stefaan
";
//No need to amend the code below
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s">
<div class="label">
<div class="dashicons dashicons-admin-plugins"></div>
Forward this to a friend</div></a>',the_title_attribute( 'echo=0' ),
rawurlencode(sprintf( $content,get_the_permalink()))
);
?>
Формат 2
<?php
//Start new line by adding \r\n
//IMPORTANT NOTE: do not remove the %s
$content="Hi there, this might be interesting for you\r\nThis is the link: %s\r\nHave a great day!\r\nStefaan";
//No need to amend the code below
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s">
<div class="label">
<div class="dashicons dashicons-admin-plugins"></div>
Forward this to a friend</div></a>',the_title_attribute( 'echo=0' ),
rawurlencode(sprintf( $content,get_the_permalink()))
);
?>
демонстрация
<a class="simple-mail-link" href="mailto:?subject=Page%20Title&body=Hi%20there%2C%20this%20might%20be%20interesting%20for%20you%0D%0AThis%20is%20the%20link%3A%20http%3A%2F%2Fblahblahblah.com%0D%0AHave%20a%20great%20day%21%0D%0AStefaan"><div class="label"> <div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a></body>
Согласно спецификации электронной почты, каждая строка электронной почты должна заканчиваться старой <CR><LF>
пара — так что вам нужно использовать \r\n
в sprintf()
строка.
"This is the link: %s.\r\n Have a great day!\r\n Stefaan"
И если \r\n
не работает, у вас есть ограничение исходного языка. При условии:
\r
является ASCII 13
(шест 0D
)\n
является ASCII 10
(шест 0A
)возможно, вы могли бы использовать " "
?
Добавить еще %s
аргумент вашей sprintf()
позвоните и передайте ему URL-кодированную версию символа перевода строки %0A
(дважды):
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
'subject',
sprintf( 'Hi there, this might be interesting for you. This is the link: %s. %sHave a great day! Stefaan', "link-here", "%0A%0A" )
);
Редактировать:
Кроме того, вы также можете просто добавить %0A
к самой строке, но вы должны помнить, чтобы избежать %
char, добавив дополнительный перед ним:
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
'subject',
sprintf( 'Hi there, this might be interesting for you. This is the link: %s. %%0A%%0AHave a great day! Stefaan', "link-here" )
);
Используйте строку в кодировке urlencoded для CR / LF
%0D%0A
где вы хотите отдохнуть.
В примере
<a
class="simple-mail-link"href="mailto:?subject=hello&body=Hello%0D%0A%0D%0AWorld!">
Я решил тщательно разобраться в проблеме и рассмотреть все попытки, которые были здесь сделаны. Если вы хотите быстрый ответ, посмотрите на принятый в настоящее время.
Чтобы использовать текст в mailto:
URL body
параметр, процентов закодировать Это. В PHP используйте rawurlencode()
. Тема также должна быть закодирована.
$subj = "Whatever subject";
$body = "Multi-\r\nline\r\nbody";
printf(
"mailto:?subject=%s&body=%s",
rawurlencode($subj),
rawurlencode($body)
);
mailto:?subject=Whatever%2Osubject&body=Multi-%0D%0Aline%0D%0Abody
Чтобы использовать его как цель HTML-ссылка, заменить символы, которые имеют особое значение в HTML, ссылками на сущности — htmlspecialchars()
для этого используется PHP, а в WordPress есть любитель (и фильтруемый) esc_html()
.
$subj = "Whatever subject";
$body = "Multi-\r\nline\r\nbody";
printf(
'<a href="%s">mailto: URL with multi-line body</a>',
htmlspecialchars(sprintf(
"mailto:?subject=%s&body=%s",
rawurlencode($subj),
rawurlencode($body)
), ENT_QUOTES)
);
<a href="mailto:?subject=Whatever%2Osubject&Multi-%0D%0Aline%0D%0Abody">mailto: URL with multi-line body</a>
Вы могли бы добавить <br>
тег в вашем sprintf (при условии, что вы хотите отобразить строку разрыва для HTML):
sprintf( 'Hi there, this might be interesting for you. This is the link: %s.<br> Have a great day!<br> Stefaan',get_the_permalink() )
РЕДАКТИРОВАТЬ:
Если вы хотите использовать текстовое письмо \r\n
и двойные кавычки:
sprintf("Hi there, this might be interesting for you. This is the link: %s.\r\n Have a great day!\r\n Stefaan",get_the_permalink() )
Вы могли бы, вероятно, забросить туда PHP_EOL
<?php
printf(
'<a class="simple-mail-link" href="mailto:?subject=%s&body=%s"><div class="label"><div class="dashicons dashicons-admin-plugins"></div>Forward this to a friend</div></a>',
the_title_attribute( 'echo=0' ),
sprintf( 'Hi there, this might be interesting for you. This is the link: %s. %sHave a great day! %sStefaan',get_the_permalink(), PHP_EOL, PHP_EOL )
);