WordPress / Codeigniter集成 - 将WP短代码属性传递给CI脚本

时间:2015-01-02 17:45:15

标签: php wordpress codeigniter shortcode

我已成功将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;

我理解处理短代码的函数的返回值是用于在Page / Post中用一些文本或小部件等替换短代码。我打算用空字符串替换短代码。但是,在处理短代码的函数中,如何将POST变量发送到我的Codeigniter脚本?

我已经搜索了几个小时。这似乎是一个非常具体的问题。感谢您的帮助。

编辑:我考虑过使用会话变量来保存值,但似乎我不能在WP中设置会话变量并从CI访问它。沿着这条思路的任何建议?

编辑2:我还有想法使用$ wpdb从CI脚本查询WP数据库。可以这样做并且已经在某些情况下工作,但是,我无法直接从WP数据库获取post_content字段,而是获取渲染文本。即我的短代码被替换为" land",但我希望查询返回WP页面中使用的短代码,而不是替换字符串。

3 个答案:

答案 0 :(得分:2)

如果要将POST数据直接发送到CodeIgniter脚本,可以使用PHP的cURL库(确保它安装在您的Web服务器中)。

重要提示:首先,您需要禁用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中的帖子请求:

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

最好的问候。

答案 1 :(得分:2)

仅用于添加有关从Wordpress DB检索内容的方法。 您也可以使用REST Web服务,然后从CI中只需要调用url,并相应地以json或任何您喜欢的格式提供所需的数据。

要在WordPress中创建Web服务,您可以使用此插件:

  
    
      

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

    
  

答案 2 :(得分:1)

我必须使用与上面提到的任何解决方案完全不同的解决方案来解决这个问题。下面的代码仍然需要调整,但你可以得到这个想法。

我必须将此功能添加到我的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表中。然后,我的控制器函数检索信息,并在其余代码中使用它。我仍然需要解决的唯一问题是:

  • 当WP页面是新的时,不会有post_id
  • 我需要替换WP po​​stmeta表中已为页面设置的值

我确信这些很容易修复。至于原始问题的解决方案 - 在WP中设置数据并在CI中检索它 - 这个答案已经完成。