Post-injeção – como excluir a publicação original

Esta pergunta refere-se ao extenso trabalho do @Pieter Goosen sobre como alterar a consulta principal usando o gancho pre_get_posts em páginas verdadeiras. Também é referenciado no códice .

Com o seu método, você pode injetar posts especificados em sua página sem precisar tocar no próprio arquivo de modelo. Isso oferece inúmeras opções de desenvolvimento.

Até agora, seu método usa CSS para ocultar o object de publicação que o loop padrão exibe para a página exibida. Existem duas ações ganchos, loop_start e loop_end que são usados ​​para criar um contêiner escondido em torno do object de publicação. Seria ótimo se fosse possível excluir completamente o object de publicação da página.

Eu tentei ligar em pre_get_posts com algo como $query->set('post__not_in', get_the_ID(); no loop_start mas isso não funcionou. Falta minhas habilidades para acabar com isso.

Você pode ajudar? Lembre-se de que não queremos tocar nos arquivos do modelo. Desde já, obrigado.

Solutions Collecting From Web of "Post-injeção – como excluir a publicação original"

Eu acho que pre_get_posts deve funcionar com $query->set() . Somente o problema que vejo é que você está usando get_the_ID() em um gancho. Tente usar a variável global $post para obter o ID da postagem atual.

Aqui está um hack simples que pode ajudá-lo a alcançar o que quer que você esteja tentando fazer -: Aviso: Isso só é testado em vinte e vinte e dezessete temas para que ele possa ou não funcionar em seu tema atual.

 class VirtualPage { /** * @var int $page_id The ID of the page where you would want to inject your custom template. **/ var $page_id = 0; /** * @var (mixed) $callback The callback function/method that will be called to replace the current post. **/ var $callback = false; function __construct( $page_id, $callback = false ) { $this->page_id = $page_id; $this->callback = $callback; /** * Set the injector when there are posts found. **/ add_action( 'posts_results', array( $this, 'posts_results' ), 10, 2 ); } function posts_results( $posts, $wp ) { if ( $wp->is_main_query() && $wp->is_singular && count( $posts ) > 0 && $posts[0]->ID == $this->page_id ) { $found_posts = count( $posts ); /** * $wp->post_count holds the number of iterated posts. We'll make WP believe that all * posts are iterated. **/ $wp->post_count = $found_posts; /** * $wp->current_post holds the current post index. Setting it to the last post index * will immediately trigger `loop_end` action hook. **/ $wp->current_post = $found_posts - 1; add_action( 'loop_end', array( $this, 'loop_end' ) ); /** * Immediately remove the hook! **/ remove_action( 'posts_results', array( $this, 'posts_results' ), 10, 2 ); } return $posts; } function loop_end() { if ( $this->callback ) { // Call your callback here or do your stuff here call_user_func( $this->callback ); } /** * Immediately remove the hook! **/ remove_action( 'loop_end', array( $this, 'loop_end' ) ); } 

}