초기화 필터 또는 조치에서 $ post를 얻습니까?


12

$ post는 특정 시간에 실행되는 후크에만 사용할 수있는 것 같습니다. $ post-> ID를 사용하여 데이터베이스에서 일부 데이터를 가져와야하는 "초기"후크가 있습니다.

지금까지 유일한 해결 방법은 the_content에 다른 필터를 추가하는 것입니다.이 필터는 $ post를 사용하여 필요한 정보를 얻습니다. 불행히도 반환 값을 화면에 표시하고 필터를 원래 호출 한 함수로 실제로 반환하지 않습니다.

필요한 데이터를 추출하지만 값을 반향하여 반환하지 않는 코드는 다음과 같습니다.

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

누구든지 내가 필요한 것을 얻는 방법에 대한 제안이 있고 나중에 플러그인에서 사용할 수 있도록 호출 함수로 다시 전달합니까?

편집 : 이것을 더 명확하게하기 위해 init에서 실행중인 필터가 있는데, DB에서 현재 게시물에 대한 정보를 검색 할 수 있어야합니다. 이렇게하려면 $ post-> ID에 액세스해야합니다. 그러나 init 내에서는 불가능하므로 필요한 결과를 어떻게 얻을 수 있습니까?

감사,

홍옥

해결 :

대답은 단순히 다음과 같이 url_to_postid를 사용하는 것으로 나타났습니다.

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

init에서도 완벽하게 작동합니다.


1
필터 훅이 아닌 액션 훅이 필요하며 범위 내에 init있기에는 너무 global $post;이릅니다. 어쩌면 당신이 달성하려는 것을 묘사하면 더 도움이 될 것입니다.
Bainternet

액션 훅은 정확히 같은 방식으로 작동합니다. init가 너무 빠르다는 것을 알고 있습니다. 필요한 결과를 얻는 방법을 알아 내려고 노력 중입니다.이 정보는 init에서 DB에서 정보를 수신하여 $ post-ID를 검색 해야하는 정보입니다.
Jonathan

init에서 이것을 정말로 해야 합니까? 나중에 갈래?
Rarst

URL에 이미 제공된 키워드가 없으면 페이지의 기본 키워드를 검색해야합니다. 해당 키워드는 DB에 저장되며 나머지 스크립트가 실행되기 전에 알아야합니다. 내가 제공 한 샘플에서 볼 수 있듯이 the_content에서 필요한 값만 얻을 수 있지만 화면에 에코되고 호출 함수로 전혀 전달되지 않습니다. 다른 해결책이 있다면 제안하십시오.
Jonathan

솔루션을 답변으로 옮기십시오. 사이트의 역학에 더 가깝습니다. 또한 제목을 풀지 않아도됩니다. 답변을 수락 할 수 있고 질문이 답변 된 것으로 표시됩니다.
Rarst

답변:


12

대답은 단순히 url_to_postid다음과 같이 사용되었다는 것이 밝혀졌습니다 .

$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );

에서조차 완벽하게 작동합니다 init.


2

이것은 WordPress 4.7에서도 작동합니다.

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

포트 및 다중 사이트 포트에서는 작동하지 않으므로 허용 된 답변을 사용하는 데 문제 있었습니다. 모든 경우에 작동해야하는 솔루션은 다음과 같습니다.

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.