obter $ post no filtro ou ação init?

12

Parece que $ post está disponível apenas para ganchos em execução em determinados horários. Eu tenho um gancho "init" que precisa extrair alguns dados do banco de dados usando o $ post-> ID.

Até agora, minha única solução alternativa foi adicionar outro filtro no the_content, que usa $ post para obter as informações necessárias. Infelizmente, ele também ecoa o valor de retorno para a tela e falha em devolvê-lo à função que chamou o filtro originalmente.

Aqui está o código que extrai os dados que eu preciso, mas ecoa e falha ao retornar o valor:

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

Alguém tem alguma sugestão sobre como obter o que eu preciso e que ele passe de volta para a função de chamada para uso posterior no plugin?

Edição: possivelmente para tornar isso mais claro, eu tenho um filtro em execução no init, que precisa ser capaz de recuperar informações no post atual do banco de dados. Para fazer isso, requer acesso a $ post-> ID. Mas isso não é possível no init, então como posso obter o resultado necessário?

Obrigado,

Jonathan

RESOLVIDO:

Acontece que a resposta foi simplesmente usar url_to_postid assim:

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

Funciona perfeitamente, mesmo a partir do init.

Jonathan
fonte
11
você precisa de um gancho de ação e não de um filtro, também inité muito cedo para global $post;estar no escopo. talvez se você descrever o que está tentando realizar, ajudará melhor.
Bainternet
gancho de ação se comporta exatamente da mesma maneira, eu tentei ambos. Eu sei que o init é muito cedo, estou tentando descobrir como obter o resultado necessário - que é um filtro em execução no init, recebendo informações do banco de dados que requer que $ post-ID seja recuperado.
31711 Jonathan
Você realmente precisa fazer isso no init? Por que não mais tarde gancho?
Rarst
Preciso recuperar a palavra-chave padrão da página, se nenhuma já tiver sido fornecida no URL. Essa palavra-chave é armazenada no banco de dados e deve ser conhecida antes da execução do restante do script. Como você pode ver no exemplo que forneci, só consigo obter o valor necessário no conteúdo_, mas, em seguida, ecoa para a tela e não volta para a função de chamada. Se você tiver outra solução, sugira-a.
31711 Jonathan
Mova sua solução para uma resposta, que estaria mais de acordo com a mecânica do site. Também não há necessidade de colocar resolvido no título - você seria capaz de aceitar a resposta e sua pergunta seria marcada como respondida.
Rarst

Respostas:

12

Acontece que a resposta foi simplesmente usar url_to_postidassim:

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

Funciona perfeitamente mesmo a partir de init.

JVC
fonte
2

Isso também funciona no WordPress 4.7:

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

Ocorreu um problema ao usar a resposta aceita, pois não funciona com portas e portas multisite . Aqui está uma solução que deve funcionar em todos os casos:

/**
* 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
fonte