dostać $ post w filtrze lub akcji init?

12

Wygląda na to, że $ post jest dostępny tylko dla haków wykonujących się w określonym czasie. Mam haczyk „init”, który musi pobrać niektóre dane z bazy danych za pomocą $ post-> ID.

Jak dotąd moim jedynym obejściem było dodanie kolejnego filtru do zawartości, który używa $ post do uzyskania potrzebnych informacji. Niestety, echo zwraca również wartość zwracaną na ekran i faktycznie nie powraca do funkcji, która pierwotnie wywołała filtr.

Oto kod, który wyodrębnia dane, których potrzebuję, ale wyświetla echo i nie zwraca wartości:

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

Czy ktoś ma jakieś sugestie, jak zdobyć to, czego potrzebuję, i przekazać je z powrotem do funkcji wywoływania w celu późniejszego użycia we wtyczce?

EDYCJA: Aby to wyjaśnić, mam filtr działający przy init, który musi być w stanie pobrać informacje o bieżącym poście z DB. Aby to zrobić, wymaga dostępu do $ post-> ID. Ale nie jest to możliwe w ramach init, więc jak mogę uzyskać wynik, którego potrzebuję?

Dzięki,

Jonathan

ROZWIĄZANY:

Okazuje się, że odpowiedzią było po prostu użycie url_to_postid w następujący sposób:

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

Działa idealnie nawet od init.

Jonathan
źródło
1
potrzebujesz haka akcji, a nie filtra, initjest też za wcześnie, global $post;aby być w zasięgu. może jeśli opisanie tego, co próbujesz osiągnąć, pomoże lepiej.
Bainternet,
hak akcji zachowuje się dokładnie tak samo, próbowałem obu. Wiem, że init jest za wcześnie, próbuję wymyślić, jak osiągnąć wymagany wynik - który jest filtrem działającym przy init, odbierającym informacje z DB, które wymagają $ post-ID do odzyskania.
Jonathan
Czy naprawdę musisz to zrobić przy init? Dlaczego nie później zaczepić?
Rarst
Muszę pobrać domyślne słowo kluczowe dla strony, jeśli nie podano go jeszcze w adresie URL. To słowo kluczowe jest przechowywane w bazie danych i musi być znane przed wykonaniem reszty skryptu. Jak widać w podanym przeze mnie przykładzie, mogę tylko uzyskać wartość, której potrzebuję w treści, ale potem echo pojawia się na ekranie i wcale nie wraca do funkcji wywoływania. Jeśli masz inne rozwiązanie, zasugeruj je.
Jonathan
Przenieś swoje rozwiązanie do odpowiedzi, byłoby to bardziej zgodne z mechaniką witryny. Również nie musisz umieszczać rozwiązania w tytule - będziesz w stanie zaakceptować odpowiedź, a twoje pytanie zostanie oznaczone jako odpowiedź.
Rarst

Odpowiedzi:

12

Okazuje się, że odpowiedzią było po prostu użycie url_to_postidtego w następujący sposób:

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

Działa idealnie nawet z init.

JVC
źródło
2

Działa to również w WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 
Rogie
źródło
2

Wystąpiły problemy z użyciem zaakceptowanej odpowiedzi, ponieważ nie działa ona z portami i portami wielostanowiskowymi . Oto rozwiązanie, które powinno działać w każdym przypadku:

/**
* 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
źródło