WordPress/Codeigniter 集成 - 将 WP 简码属性传递给 CI 脚本
WordPress/Codeigniter Integration - Pass WP shortcode attribute to CI script
我已成功将 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');
我需要做的是从我的 WP 插件发送一个 POST
变量到 CI 脚本,因此行:
$_POST['property_type'] = $value;
我知道处理简码的函数的 return 值是为了用 Page/Post 中的一些文本或小部件等替换简码。我打算用空字符串替换简码。但是,在处理短代码的函数中,如何将 POST
变量发送到我的 Codeigniter 脚本?
我为此搜索了几个小时。这似乎是一个非常具体的问题。感谢您的帮助。
编辑: 我想过使用会话变量来保存值,但我似乎无法在 WP 中设置会话变量并从 CI.沿着这个思路有什么建议吗?
编辑 2: 我也有使用 $wpdb 从 CI 脚本查询 WP 数据库的想法。可以这样做并且已经在某些情况下工作,但是,我无法直接从 WP 数据库获取 post_content
字段,而是获取呈现的文本。即我的简码被 "land" 一词替换,但我希望查询 return WP 页面中使用的简码,而不是替换字符串。
如果您想将 POST 数据直接发送到 CodeIgniter 脚本中,您可以使用 PHP 的 cURL 库(确保它已安装在您的网络服务器中)。
重要提示:首先您需要禁用 CodeIgniter 的 CSRF 检查。您可以从整个框架中禁用,或者您可以创建一个预系统挂钩以在特定控制器中禁用 CSRF。
这是您的 WP 脚本中的 cURL 请求示例:
$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.
然后,您可以在 CodeIgniter 中创建控制器来处理您的 post 请求:
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";
}
}
有关 PHP 的 cURL 库的更多信息,您可以阅读 manual。
此致。
我不得不使用与我上面提到的任何解决方案完全不同的解决方案来解决这个问题。下面的代码仍然需要调整,但你可以理解。
我不得不将此功能添加到我的 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 功能会将最终用户输入页面的短代码中的一些信息保存到 WP 中的 postmeta table。然后,我的控制器函数检索信息,并在其余代码中使用它。我仍然需要解决的唯一问题是:
- WP页面新建时,不会有post_id
- 我需要替换 WP postmeta table 中已经为页面设置的值
我相信这些很容易修复。至于原始问题的解决方案 - 在 WP 中设置数据并在 CI 中检索 - 这个答案是完整的。
只是为了补充您从 Wordpress 数据库中检索内容的方法。
您还可以使用 REST 网络服务,然后从 CI 您只需要调用 url 并相应地以 json 或您喜欢的任何格式提供所需的数据。
要在 WordPress 中创建网络服务,您可以使用此插件:
我已成功将 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');
我需要做的是从我的 WP 插件发送一个 POST
变量到 CI 脚本,因此行:
$_POST['property_type'] = $value;
我知道处理简码的函数的 return 值是为了用 Page/Post 中的一些文本或小部件等替换简码。我打算用空字符串替换简码。但是,在处理短代码的函数中,如何将 POST
变量发送到我的 Codeigniter 脚本?
我为此搜索了几个小时。这似乎是一个非常具体的问题。感谢您的帮助。
编辑: 我想过使用会话变量来保存值,但我似乎无法在 WP 中设置会话变量并从 CI.沿着这个思路有什么建议吗?
编辑 2: 我也有使用 $wpdb 从 CI 脚本查询 WP 数据库的想法。可以这样做并且已经在某些情况下工作,但是,我无法直接从 WP 数据库获取 post_content
字段,而是获取呈现的文本。即我的简码被 "land" 一词替换,但我希望查询 return WP 页面中使用的简码,而不是替换字符串。
如果您想将 POST 数据直接发送到 CodeIgniter 脚本中,您可以使用 PHP 的 cURL 库(确保它已安装在您的网络服务器中)。
重要提示:首先您需要禁用 CodeIgniter 的 CSRF 检查。您可以从整个框架中禁用,或者您可以创建一个预系统挂钩以在特定控制器中禁用 CSRF。
这是您的 WP 脚本中的 cURL 请求示例:
$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.
然后,您可以在 CodeIgniter 中创建控制器来处理您的 post 请求:
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";
}
}
有关 PHP 的 cURL 库的更多信息,您可以阅读 manual。
此致。
我不得不使用与我上面提到的任何解决方案完全不同的解决方案来解决这个问题。下面的代码仍然需要调整,但你可以理解。
我不得不将此功能添加到我的 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 功能会将最终用户输入页面的短代码中的一些信息保存到 WP 中的 postmeta table。然后,我的控制器函数检索信息,并在其余代码中使用它。我仍然需要解决的唯一问题是:
- WP页面新建时,不会有post_id
- 我需要替换 WP postmeta table 中已经为页面设置的值
我相信这些很容易修复。至于原始问题的解决方案 - 在 WP 中设置数据并在 CI 中检索 - 这个答案是完整的。
只是为了补充您从 Wordpress 数据库中检索内容的方法。 您还可以使用 REST 网络服务,然后从 CI 您只需要调用 url 并相应地以 json 或您喜欢的任何格式提供所需的数据。
要在 WordPress 中创建网络服务,您可以使用此插件: