получить $ post в init filter или action?

12

Кажется, что $ post доступен только для хуков, выполняющихся в определенное время. У меня есть ловушка "init", которая должна извлечь некоторые данные из базы данных, используя $ 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, который должен иметь возможность получать информацию о текущем посте из БД. Для этого требуется доступ к $ 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, получающий информацию из БД, для которой требуется $ post-ID для извлечения.
Джонатан
Вы действительно должны сделать это на init? Почему не позже зацепить?
Rarst
Я должен получить ключевое слово по умолчанию для страницы, если ни одно из них не было уже указано в URL. Это ключевое слово хранится в БД и должно быть известно до того, как будет выполнен любой из остальных сценариев. Как вы можете видеть из примера, который я предоставил, я могу получить только то значение, которое мне нужно, в the_content, но затем оно отражается на экране и вообще не возвращается к вызывающей функции. Если у вас есть другое решение, предложите его.
Джонатан
Пожалуйста, перенесите свое решение в ответ, чтобы оно больше соответствовало механике сайта. Также не нужно ставить решено в заголовке - вы сможете принять ответ и ваш вопрос будет помечен как ответивший.
Rarst

Ответы:

12

Оказывается, ответ был просто использовать url_to_postidкак это:

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

Работает отлично даже от init.

JVC
источник
2

Это также работает в WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 
Rogie
источник
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 );
}
Blackbam
источник