Получить $post в фильтре или действии init?

13 июл. 2011 г., 10:45:46
Просмотры: 16.4K
Голосов: 15

Похоже, что $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.

5
Комментарии

вам нужен хук действия, а не хук фильтра, также init слишком рано для global $post; чтобы быть в области видимости. возможно, если вы опишете, чего пытаетесь достичь, это поможет лучше.

Bainternet Bainternet
13 июл. 2011 г. 11:35:17

хук действия ведет себя точно так же, я пробовал оба варианта. Я знаю, что init слишком рано, я пытаюсь понять, как достичь нужного результата — фильтр, который работает на init и получает информацию из БД, для извлечения которой требуется $post-ID.

Jonathan Jonathan
13 июл. 2011 г. 19:02:03

Действительно ли вам нужно делать это на init? Почему бы не использовать более поздний хук?

Rarst Rarst
13 июл. 2011 г. 22:08:32

Мне нужно получить ключевое слово по умолчанию для страницы, если оно не было предоставлено в URL. Это ключевое слово хранится в базе данных и должно быть известно до выполнения остальной части скрипта. Как видно в предоставленном мной примере, я могу получить нужное значение только в the_content, но затем оно выводится на экран и совсем не передается обратно в вызывающую функцию. Если у вас есть другое решение, пожалуйста, предложите его.

Jonathan Jonathan
13 июл. 2011 г. 22:47:39

Пожалуйста, перенесите ваше решение в ответ, это больше соответствует механике сайта. Также не нужно писать решено в заголовке - вы сможете принять ответ, и ваш вопрос будет помечен как отвеченный.

Rarst Rarst
15 июл. 2011 г. 12:26:52
Все ответы на вопрос 3
0
16

Оказалось, решение заключается в простом использовании функции url_to_postid следующим образом:

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

Работает идеально, даже если вызывать из хука init.

10 окт. 2011 г. 06:12:55
0

Возникли проблемы с использованием принятого ответа, так как он не работает с портами и портами мультисайта. Вот решение, которое должно работать в любом случае:

/**
* Примечание: Эта функция будет работать только для ОДИНОЧНЫХ записей/страниц/типов записей
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// пример использования
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 );
}
3 июл. 2018 г. 18:27:29
0

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

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true );
21 февр. 2017 г. 07:04:24