2015-01-02 3 views
3

WordPress와 Codeigniter를 성공적으로 통합했습니다. 에디터에서 사용할 수있는 짧은 코드를 추가하는 플러그인을 만들었습니다. 이것은 예상대로 작동합니다. 따라서 라인, 내가해야 할 일은WordPress/Codeigniter 통합 - WP 단축 코드 속성을 CI 스크립트에 전달

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');

는 CI 스크립트에 내 WP 플러그인에서 POST 변수를 보낼 수있다 :

$_POST['property_type'] = $value;

나는 것으로 알고 여기 내 코드입니다 단축 코드를 처리하는 함수의 반환 값은 단축 코드를 Page/Post의 일부 텍스트 또는 위젯 등으로 대체하기위한 것입니다. shortcode를 빈 문자열로 바꿀 계획입니다. 그러나 단축 코드를 처리하는 함수 내에서 POST 변수를 Codeigniter 스크립트에 어떻게 보내면됩니까?

나는 이것을 몇 시간 씩 검색했다. 매우 구체적인 질문 인 것 같습니다. 귀하의 도움을 주시면 감사하겠습니다.

EDIT : 세션 변수를 사용하여 값을 저장하는 방법에 대한 생각이 있었지만 WP에서 세션 변수를 설정하고 CI에서 액세스 할 수있는 것처럼 보이지 않았습니다. 이 사고 방식에 따른 제안 사항이 있습니까?

EDIT 2 : 또한 $ wpdb를 사용하여 CI 스크립트에서 WP 데이터베이스를 쿼리하는 아이디어가있었습니다. 이 작업은 가능하지만 일부 시나리오에서는 이미 작동하지만 WP 데이터베이스에서 post_content 필드를 직접 가져올 수는 없으며 대신 렌더링 된 텍스트가 표시됩니다. 즉 내 짧은 코드가 "land"라는 단어로 대체되었지만 대체 문자열이 아닌 WP 페이지에서 사용 된 단축 코드를 반환하도록 쿼리를 원합니다.

+0

어느 쪽이든 당신은 문제가 아직 전달되지 않은 :

그리고 워드 프레스의 내부 웹 서비스를 만드는

, 당신은이 플러그인을 사용할 수있다 POST 변수 작동 방식에 대한 오해가 있습니다. 완전한 예를 보여주십시오. –

+0

$ _POST는 매우 '글로벌'입니다. ([$ GLOBALS - 전체 범위에서 사용할 수있는 모든 변수 참조] (http://php.net/manual/en/reserved.variables.globals. PHP를 재미있게 만들어주는 많은 것들이 있습니다. 어디에서나 사용할 수 있기 때문에 언제 어디서나 그들을 전달할 필요가 없습니다. PHP는이 '웹 물건'을 쉽게 만들기 위해 많은 작업을 수행합니다. –

+0

문제에 대해 설명합니다. 현상금에 대한 코멘트에서 아주 잘 그리고 나는 POST에 대한 설명을 요구하지 않는 질문을 확신합니다. 나는 초보자가 아니므로 PHP가하는 "재미"에 관한 모든 것을 알고 있습니다! WordPress CI가 잘 작동하지 않으며이 시나리오의 섬세한 복잡함을 이해하는 사람은 PHP 전문가가 필요하지 않습니다. –

답변

1

나는 위에서 언급 한 것과 완전히 다른 해결책을 사용하여이 문제를 해결해야했습니다. 아래 코드는 여전히 조정해야하지만 아이디어를 얻을 수 있습니다.전과,

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]; } }

기본적으로 :

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 컨트롤러 인덱스 기능에, 나는이 추가 :

나는 나의 WP 플러그인에이 기능을 추가했다 WP 페이지가 업데이트되면 내 WP 기능은 최종 사용자가 페이지의 포스트 메타 테이블에 입력 한 짧은 코드의 일부 정보를 WP에 저장합니다. 그런 다음 내 컨트롤러 함수는 정보를 검색하여 나머지 코드에서 사용합니다. 나는 아직도 해결해야하는 유일한 문제는 다음과 같습니다 WP 페이지가 새로운 경우

  • 내가 이미 페이지에 대해 설정된 WP의 postmeta 테이블에 값을 대체 할 필요가 post_id를에게 없을 것

이것은 쉽게 수정 될 수 있습니다. 원래 질문에 대한 해결책은 WP에서 데이터를 설정하고 CI에서 가져 오는 것입니다.이 대답은 완전합니다.

2

POST 데이터를 CodeIgniter 스크립트로 직접 보내려면 PHP의 cURL 라이브러리를 사용할 수 있습니다 (웹 서버에 설치되어 있는지 확인하십시오).

중요 사항 : 먼저 CodeIgniter의 CSRF 검사를 비활성화해야합니다. 전체 프레임 워크에서 비활성화하거나 특정 컨트롤러에서 CSRF를 비활성화하기 위해 사전 시스템 후크를 만들 수 있습니다. 그런 다음

$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"; 
    } 
} 

여기

는 WP 스크립트에서 cURL을 요청의 예입니다 PHP의 cURL 라이브러리에 대한 자세한 내용은 manual을 참조하십시오.

감사합니다.

+0

이것은 내가 원하는 것보다 더 들리게 들립니다. 나는 오늘 그것을 시도하고 돌아올 것입니다. 약 2 ~ 3 시간 정도 걸릴 것입니다. –

+0

죄송합니다. 저는 오늘 귀하의 솔루션을 사용해 보았습니다. cURL이 설치되었는지 확인하고 CI의 CSRF 검사를 비활성화했지만 CI 컨트롤러에서 변수를 가져올 수 없었습니다. 나는 이것에 종일 종사하고, 완전히 다른 해결책을 마침내 계산했다. 나는 아래의 질문에 답할 것이다. 도와 줘서 고마워. –

+0

cURL은 거의 매일 한 스크립트에서 다른 스크립트로 게시물을 보내는 데 사용합니다 (심지어 Java Server Pages까지). cURL 요청으로 게시물을 보내는 것과 관련하여 코드 논리에서 일부 세부 사항을 놓친 것 같습니다. 어쨌든 해결책을 찾았 음을 아는 것이 좋습니다. 문안 인사. –

2

Wordpress DB에서 콘텐츠 검색과 관련하여 접근법을 추가하기위한 것입니다. 또한 CI에서 REST 웹 서비스 수단을 사용할 수도 있습니다. 그러면 URL을 호출하기 만하면되며 json 또는 원하는 형식으로 필요한 데이터를 제공합니다.

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