2015-11-16 4 views
1

Я создаю приложение на WordPress, для которого требуется простая форма интерфейса, где каждый может отправлять информацию, которая должна быть сохранена в базе данных. Я пытаюсь справиться с этим через REST API. (Из-за характера приложения не может быть перенаправления страницы при отправке этой информации.)WordPress REST API - разрешить кому-либо POST

У меня нет проблем с настройкой API REST (v2), чтобы я мог отправить сообщение. Он отлично работает, когда я вошел в WordPress. Когда я пытаюсь заполнить форму, когда я не вошел в WordPress, я получаю сообщение об ошибке.

Не удалось загрузить ресурс: сервер ответил со статусом 403 (Forbidden)

Как я могу установить API, чтобы получить сообщение от любого, без проверки подлинности?

Вот мой JavaScript:

$('#post-submission-form').on('submit', function(e) { 
    e.preventDefault(); 
    var title = $('#post-submission-title').val(); 
    var excerpt = $('#post-submission-excerpt').val(); 
    var content = $('#post-submission-content').val(); 
    var status = 'draft'; 

    var data = { 
     title: title, 
     excerpt: excerpt, 
     content: content 
    }; 

    $.ajax({ 
     method: "POST", 
     url: POST_SUBMITTER.root + 'wp/v2/posts', 
     data: data, 
     beforeSend: function (xhr) { 
      //xhr.setRequestHeader('X-WP-Nonce', POST_SUBMITTER.nonce); 
     }, 
     success : function(response) { 
      console.log(response); 
      alert(POST_SUBMITTER.success); 
     }, 
     fail : function(response) { 
      console.log(response); 
      alert(POST_SUBMITTER.failure); 
     } 

    }); 

}); 

Вот как я инициализация моего JavaScript:

function holiday_scripts() { 

    // Onload JS 
    wp_enqueue_script('holiday-js', get_template_directory_uri() . '/js/holiday.js', array(), false, true); 

    //localize data for script 
    wp_localize_script('holiday-js', 'POST_SUBMITTER', array(
     'root' => esc_url_raw(rest_url()), 
     'nonce' => wp_create_nonce('wp_rest'), 
     'success' => __('Thanks for your submission!', 'your-text-domain'), 
     'failure' => __('Your submission could not be processed.', 'your-text-domain'), 
     'current_user_id' => 9 
     ) 
    ); 
} 
add_action('wp_enqueue_scripts', 'holiday_scripts'); 

Кто-нибудь есть какие-либо идеи о том, как это сделать?

Спасибо!

ответ

1

Есть три различных варианта для проверки подлинности на REST API:

  1. Cookie - это то, что вы используете сейчас
  2. OAuth - требует плагин OAuth и внедренный ключ на переднем конце
  3. Basic - требуется ввести имя пользователя/пароль на переднем конце

См. Документацию по использованию этих методов. re: http://v2.wp-api.org/guide/authentication/.

Существуют очевидные риски для безопасности при встраивании информации об аутентификации на переднем конце, которая требуется OAuth и Basic, поскольку любой пользователь сможет аутентифицироваться как пользователь, с которым связан ключ. Я не достаточно хорошо знаком с плагином WP OAuth, чтобы узнать, насколько вы можете контролировать доступ, но я не думаю, что вы действительно можете.

Самое легкое решение - написать свой собственный метод вне REST API для обработки этих обновлений (или внести вклад в проект, чтобы сделать невозможным аутентификацию запросов). Я написал руководство для Creating AJAX Functions на своем веб-сайте, но в основном вы хотите прикрепить функцию к крюку wp_ajax_nopriv_*, где * является параметром «действия» вашего запроса. В вашей подключенной функции PHP вы обрабатываете вставку сообщений и отвечаете на JSON (вы даже можете сопоставить формат WP REST API).

PHP

// insert new post 
function create_post_33741541() { 
    // use the $_POST to create your post 
    $args = array(
     'post_title' => isset($_POST['title'])? $_POST['title'] : 'Empty Title', 
     // more parameters.... 
    ); 
    $post_id = wp_insert_post($args); 

    // make a response 
    $response = array('post_id' => $post_id, 'message' => 'post created!'); 

    // set the content type and return json encode response, then exit 
    header('Content-type: application/json'); 
    die(json_encode($response)); 
} 
// use wp_ajax_nopriv to access from front end 
add_action('wp_ajax_nopriv_create_post_33741541', 'create_post_33741541'); 
add_action('wp_ajax_create_post_33741541', 'create_post_33741541'); 

JavaScript

function createThePost(){ 
    var data = { 
     // use the part after "wp_ajax_nopriv" as the action 
     action: 'create_post_33741541' 
     title: 'Your title', 
     // other params 
    }; 

    $.ajax({ 
     method: "POST", 
     url: ajaxurl, 
     data: data, 
     // your handlers 
    }); 
} 
+0

Спасибо за ответ.Я тестирую этот маршрут, но я не могу заставить часть PHP этого запускать. Я добавил аналогичную версию своей функции в мои функции.php, но кажется, что мои значения не проходят. Как анализируются данные в функции PHP? Кажется, что $ args, поскольку он передан в wp_insert_post ($ args), не является этими данными. – mbacon40

+0

Код в моем ответе не будет запущен, просто псевдокод. «Данные» отправляются как POST, поэтому, если вы хотите получить «действие», вы будете использовать '$ _POST ['action']'. «$ Args» для вставки должен содержать некоторые требуемые значения, проверьте документы для этого метода. – doublesharp

+0

Для совершенно другого варианта вы также можете попробовать следующее: http://www.advancedcustomfields.com/resources/using-acf_form-to-create-a-new-post/?version=4 – doublesharp