2015-11-30 3 views
2

Я хочу создать маршрут в моем плагине wordpress, который не связан со страницей, а с действием, которое отправляет электронное письмо. Поэтому я бы послал запрос на получение, как этотWordpress - создать маршрут к действию в плагине

example.com/send/[email protected] 

, и это будет ссылка на действие с адресом электронной почты в качестве параметра. Я очень новичок в Wordpress, поэтому простите меня, если это глупый вопрос, но я действительно изо всех сил пытаюсь достичь этого или evebn найти хорошую отправную точку, может ли кто-нибудь помочь?

+0

Есть ли что-то уже существующее на '/ send /' (например, страница) или нет? Также будет для вас такой URL-адрес: 'example.com/send/email/someone @ example.com'? –

+0

нет его настройки URL, с которым я борется. мне нужно создать страницу для этого? извините Im все еще совершенно новый для wordpress.Этот URL-адрес будет прекрасен, пока я получу адрес электронной почты от него. – Neil

ответ

2

Хорошим вариантом в вашем случае будет использование конечной точки перезаписи. Конечная точка перезаписи позволяет добавлять дополнительные параметры запроса к определенным URL-адресам. Например, вы можете добавить конечную точку gallery ко всем сообщениям, которые могут отображать другой шаблон, показывающий все изображения для данного сообщения. Более подробную информацию о add_rewrite_endpoint() можно найти на странице Codex.

Ниже приведен код, который добавляет конечную точку send к EP_ROOT (домашняя страница сайта). Обратите внимание, что после добавления этого кода вам нужно будет перейти на Settings > Permalinks, чтобы конечная точка переписывания начала работать.

Как только у нас есть конечная точка перезаписи на месте, мы подключаемся к действию template_redirect, чтобы проверить наличие запроса send var. Если send нет, то мы ничего не делаем.

Если send присутствует, но пустой (например, если вы загружаете страницу http://example.com/send/), то мы перенаправляем на главную страницу.

В противном случае мы разделили send на несколько частей на каждые / и присвоили это переменной $send_parts. Затем мы используем оператор switch, чтобы узнать, что такое $send_action (первая часть после /send/) и действовать соответственно.

Сейчас мы проверяем только действие email (если это не электронная почта, мы снова перенаправляемся на домашнюю страницу). Мы проверяем, существует ли реальный адрес электронной почты ($send_parts[1]) и является ли он действительным адресом электронной почты (я должен отметить, что is_email() не соответствует RFC и может отклонять действительные адреса электронной почты, поэтому используйте с осторожностью). Если это действительный адрес электронной почты, мы используем wp_mail() для отправки электронной почты, иначе мы перенаправляемся на домашнюю страницу.

Теперь, поскольку я не знаю, как вы планируете реализовать это, мой код не охватывает такие вещи, как аутентификация (кто может отправлять электронные письма - если это все, я могу злоупотреблять вашим сайтом и спамом пользователей и получать ваши почтовый сервер blacklisted - bad :(), генерация сообщения электронной почты Subject и Message (он будет динамическим через переменные $_POST, будет ли он заранее определен и т. д.). Это особенности, которые вам придется реализовать на ваш собственный.

Как только код, указанный ниже, помещается в соответствующий файл (файл .php, который загружается в текущую тему или файл активного плагина), и вы регенерируете свои правила перезаписи (перейдя на Settings > Permalinks), вы может перейти на http://example.com/send/email/[email protected]/, и вы должны получить письмо с субъектом t «Привет» и сообщение «Это сообщение».

function so_34002145_add_email_endpoint() { 
    add_rewrite_endpoint('send', EP_ROOT); 
} 
add_action('init', 'so_34002145_add_email_endpoint', 10); 

function so_34002145_handle_send_email() { 
    $send = get_query_var('send', null); 

    // This is not a /send/ URL 
    if (is_null($send)) { 
     return; 
    } 

    // We're missing an action, the URL is /send/ 
    // Take the user to the home page, since this is an incomplete request. 
    if (empty($send)) { 
     wp_redirect(home_url('/')); 
     exit; 
    } 

    $send_parts = explode('/', $send); 

    $send_action = $send_parts[0]; 

    switch ($send_action) { 
     case 'email': 
      $email = ! empty($send_parts[1]) ? $send_parts[1] : false; 
      if (! $email || ! is_email($email)) { 
       // A missing or invalid email address, abort 
       wp_redirect(home_url('/')); 
       exit; 
      } 

      wp_mail($email, 'Hello', 'This is a message'); 

      break; 

     default: 
      // This is an unknown action, send to the home page 
      wp_redirect(home_url('/')); 
      exit; 
      break; 
    } 
} 
add_action('template_redirect', 'so_34002145_handle_send_email', 10); 
+1

Большое вам спасибо за этот ответ. Вы объясните это действительно хорошо, и это именно то, что мне нужно! Могу вернуться к этому сейчас, поскольку я его откладывал. Я бы проголосовал за вас, но у меня не хватает репутации – Neil

Смежные вопросы