отримати $ 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;
}

Хтось має якісь пропозиції щодо того, як отримати те, що мені потрібно, і повернути його до функції виклику для подальшого використання в плагіні?

EDIT: Щоб можливо зробити це більш зрозумілим, у мене є фільтр, що працює в 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? Чому не пізніше гачок?
Рарст

Мені потрібно знайти ключове слово за замовчуванням для сторінки, якщо жодне не вказане в URL-адресі. Це ключове слово зберігається в БД, і воно повинно бути відомо перед виконанням будь-якого з решти сценаріїв. Як ви бачите у наданому нами зразку, я можу отримати лише потрібне мені значення у_контенті, але потім воно перегукується на екран і зовсім не переходить до функції виклику. Якщо у вас є інше рішення, будь ласка, запропонуйте його.
Джонатан

Будь ласка, перекладіть своє рішення на відповідь, це буде більше відповідати механіці сайту. Також не потрібно ставити вирішені в назві - ви зможете прийняти відповідь, і ваше питання буде позначено як відповідь.
Рарст

Відповіді:


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 );
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.