Интеграция 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, а не строку замены.
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 вы можете прочитать руководство .
С наилучшими пожеланиями.
Просто в дополнение к вашему подходу к извлечению контента из базы данных Wordpress. Вы также можете воспользоваться веб-сервисом REST, тогда из CI вам нужно будет только вызвать URL-адрес, который, соответственно, предоставляет необходимые данные в формате json или любом другом формате, который вам нравится.
А для создания веб-сервиса внутри WordPress вы можете использовать этот плагин:
Мне пришлось решить эту проблему, используя совершенно другое решение, чем любое из тех, о которых я упоминал выше. Приведенный ниже код все еще нуждается в доработке, но вы можете понять идею.
Мне пришлось добавить эту функцию в свой плагин 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 - этот ответ полный.