Интеграция WordPress/Codeigniter - Передача атрибута шорткода WP в скрипт CI


Я успешно интегрировал WordPress с Codeigniter. Я создал плагин, который добавляет шорткод, который можно использовать в редакторе. Это также работает, как и ожидалось. Вот мой код:

function get_property_filters($atts) { foreach ($atts as $key => $value) { $_POST['property_type'] = $value; } return 'Something to replace shortcode in WP Page'; } add_shortcode('property_filters', 'get_property_filters');

Что мне нужно сделать, это отправить переменную POST из моего плагина WP в скрипт CI, отсюда строка:

$_POST['property_type'] = $value;

Я понимаю, что возвращаемое значение функции, которая обрабатывает шорткод, предназначено для замены шорткода каким-либо текстом или виджетом и т. Д. В Страница/Сообщение. Я планирую заменить шорткод пустой строкой. Но в рамках функции, которая обрабатывает шорткод, как я могу отправить переменную POST в мой скрипт Codeigniter?

Я искал это в течение нескольких часов. Кажется, это очень конкретный вопрос. Мы ценим вашу помощь.

РЕДАКТИРОВАТЬ: У меня была мысль об использовании переменных сеанса для сохранения значения, но, похоже, я не могу установить переменную сеанса в WP и получить к ней доступ из CI. Любые предложения в этом направлении мысли?

РЕДАКТИРОВАТЬ 2: Мне также пришла в голову идея запросить базу данных WP из скрипта CI, используя $wpdb. Это возможно сделать и уже работает в некоторых сценариях, однако я не могу получить поле post_content непосредственно из базы данных WP, вместо этого я получаю отрисованный текст. т.Е. Мой шорткод заменяется словом "земля", но я хочу, чтобы запрос возвращал шорткод, который использовался на странице WP, а не строку замены.

Author: Amy McCrobie, 2015-01-02

3 answers

Если вы хотите отправить данные POST непосредственно в скрипт CodeIgniter, вы можете использовать библиотеку CURL PHP (убедитесь, что она установлена на вашем веб-сервере).

Важно: Сначала вам нужно будет отключить проверку CSRF CodeIgniter. Вы можете отключить весь фреймворк или создать предсистемный хук для отключения CSRF в определенном контроллере.

Вот пример запроса cURL в вашем WP-скрипте:

$value = "POST VALUE";
$post_data = array();
$post_data["property_type"] = $value;
$codeigniter_url = "http://example.com/codeigniter/handle_post";

$post = curl_init();

curl_setopt($post, CURLOPT_URL, $codeigniter_url); //The URL to send the request
curl_setopt($post, CURLOPT_POST, count($post_data)); //Amount of POST fields
curl_setopt($post, CURLOPT_POSTFIELDS, $post_data); //The POST data.
curl_setopt($post, CURLOPT_RETURNTRANSFER, TRUE); //Returns the output from the requested script
curl_setopt($post, CURLOPT_SSL_VERIFYPEER, FALSE); //Do not verify the SSL certificate.

//The variable below will have the output from your Controller function in CodeIgniter.
$result = trim(curl_exec($post));

//The variable below will have any possible errors from the cURL request.
$errors = trim(curl_error($post));

//Now you can work with the $result variable which contains the results from your CI
//Controller.

Затем вы можете создать свой контроллер для обработки вашего запроса post в CodeIgniter:

class Handle_post extends CI_Controller {
    public function index()
    {
        $property_type = $this->input->post("property_type");
        //Your actions here...

        echo "RESULT FROM THE CONTROLLER IN CODEIGNITER";
    }
}

Для получения дополнительной информации о библиотеке cURL PHP вы можете прочитать руководство .

С наилучшими пожеланиями.

 2
Author: Byte Bit, 2015-01-06 10:15:17

Просто в дополнение к вашему подходу к извлечению контента из базы данных Wordpress. Вы также можете воспользоваться веб-сервисом REST, тогда из CI вам нужно будет только вызвать URL-адрес, который, соответственно, предоставляет необходимые данные в формате json или любом другом формате, который вам нравится.

А для создания веб-сервиса внутри WordPress вы можете использовать этот плагин:

Https://wordpress.org/plugins/json-api/

 2
Author: Jenis Patel, 2015-01-07 08:11:24

Мне пришлось решить эту проблему, используя совершенно другое решение, чем любое из тех, о которых я упоминал выше. Приведенный ниже код все еще нуждается в доработке, но вы можете понять идею.

Мне пришлось добавить эту функцию в свой плагин WP:

function save_shortcodes_to_db($content) { global $post; $postID = $post->ID; global $wpdb; if (has_shortcode($content, 'property_filters')) { $filterArr = array('area=', 'prop_type=', 'agent=', 'office='); foreach ($filterArr as $filter) { $filterpos = strpos($content,$filter); //63 if ($filterpos !== false) { $filterstrlen = strlen($filter); //10 $filterendpos = $filterpos + $filterstrlen - 1; $offset = $filterendpos; $valuestartpos = $filterendpos + 1; $endbracket = ']'; $endbracketpos = strpos($content,$endbracket,$offset); $valuelen = $endbracketpos - $valuestartpos; $meta_value = substr($content,$valuestartpos,$valuelen); $meta_key = 'rc_'.rtrim($filter,'='); $data = array('post_id' => $postID, 'meta_key' => $meta_key, 'meta_value' => $meta_value); $wpdb->insert('wp_postmeta', $data); } } } return $content; } add_filter( 'content_save_pre' , 'save_shortcodes_to_db' , 10, 1);

Затем в моей функции индекса контроллера CI я добавил следующее:

global $wpdb; if ($this->session->userdata('referer')) { $pageurl = $this->session->userdata('referer'); $pos = strpos($pageurl,'listings'); if ($pos !== false) { $page_by_path = get_page_by_path($pageurl); $postid = $page_by_path->ID; $content = $wpdb->get_col("SELECT post_content FROM $wpdb->posts WHERE ID=".$postid.";"); $prop_type_meta_value = $wpdb->get_col("SELECT meta_value FROM $wpdb->postmeta WHERE post_id=".$postid." AND meta_key = 'rc_prop_type';"); $data['wp_content'] = $content[0]; } }

В принципе, перед обновлением страницы WP моя функция WP сохраняет некоторую информацию из шорткода(ов), которые были введены на страницу конечным пользователем, чтобы таблица postmeta в WP. Затем моя функция контроллера извлекает информацию и использует ее в остальной части кода. Единственные проблемы, которые мне все еще нужно решить, это:

  • когда страница WP новая, не будет post_id
  • Мне нужно заменить значения в таблице WP postmeta, которые уже были установлены для страницы

Я уверен, что это легко исправить. Что касается решения исходного вопроса - установить данные в WP и получить их в CI - этот ответ полный.

 1
Author: Amy McCrobie, 2015-01-06 21:47:58