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.


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.


2

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

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

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 );
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.