【问题标题】:WordPress/Codeigniter Integration - Pass WP shortcode attribute to CI scriptWordPress/Codeigniter 集成 - 将 WP 短代码属性传递给 CI 脚本
【发布时间】:2015-01-02 17:45:15
【问题描述】:

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

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

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

编辑:我曾想过使用会话变量来保存值,但我似乎无法在 WP 中设置会话变量并从 CI 访问它。沿着这个思路有什么建议吗?

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

【问题讨论】:

  • 要么您还没有传达问题,要么您对 POST 变量的工作方式有误解。请给出一个完整的例子。
  • $_POST 非常“全球性”(您可以通过$GLOBALS — References all variables available in global scope 访问许多“有趣的东西”。这是使 PHP 变得有趣的很多原因。您无需将它们传递给任何地方它们总是可用 - 无处不在。PHP 做了很多工作来使这个“网络东西”更容易。
  • 这个问题在 cmets 中得到了很好的解释,我很确定这个问题不是要求对 POST 进行解释。我不是新手,所以我对 PHP 所做的“有趣”的事情了如指掌!请只有知道 WordPress 和 CI 不能很好地协同工作并且了解这种情况的微妙复杂性的人才能做出回应。我不需要 PHP 专家,因为我已经是 PHP 专家了。

标签: php wordpress codeigniter shortcode


【解决方案1】:

如果您想将 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

最好的问候。

【讨论】:

  • 这听起来更像是我需要的。我今天会试一试,然后回复你。大概需要 2 到 3 个小时。
  • 对不起。我今天早些时候尝试了您的解决方案,确保安装了 cURL,并禁用了 CI 的 CSRF 检查,但我仍然无法在我的 CI 控制器中获取变量。我为此工作了一整天,终于找到了一个完全不同的解决方案。我将回答下面的问题。非常感谢您的帮助!
  • cURL 是我几乎每天都使用的东西,用于将帖子从一个脚本发送到另一个脚本(甚至是 Java Server Pages)。您可能在代码逻辑中遗漏了一些关于使用 cURL 请求发送帖子的细节。无论如何,很高兴知道您找到了解决方案。问候。
【解决方案2】:

只是为了补充您从 Wordpress DB 检索内容的方法。 您还可以使用 REST web-service 方式,然后从 CI 中您只需要调用 url 并相应地以 json 或您喜欢的任何格式提供所需的数据。

要在 WordPress 中创建网络服务,您可以使用这个插件:

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

【讨论】:

    【解决方案3】:

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

    我必须将此功能添加到我的 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 中检索 - 这个答案是完整的。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多