초기화 필터 또는 조치에서 $ 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.