2011-09-24 16 views
5

Mam niestandardowy typ postu, który obsługuje wpisy chronione hasłem. W niestandardowej pętli przy użyciu nowego obiektu WP_Query, chcę wykluczyć te posty chronione hasłem z wyników. Jakie argumenty muszę ustawić, aby to zrobić? Używam najnowszej wersji WordPressa 3.2.1.Jak wykluczyć posty chronione hasłem w pętli WordPress

+0

Od WordPress 3.9 istnieje również zapytanie "has_password", które można użyć. –

Odpowiedz

1

Czy przyjrzał się post_status argument z WP_Query?

"Protected" wydaje się być dobrym kandydatem do wykluczenia.

Edit: Ok, wydaje się, że będziesz musiał zmodyfikować gdzie klauzula, aby osiągnąć to, co chcesz:

// Create a new filtering function that will add our where clause to the query 
function filter_where($where = '') { 
    // exclude password protected 
    $where .= " AND post_password = ''"; 
    return $where; 
} 

if (!is_single()) { add_filter('posts_where', 'filter_where'); } 
$query = new WP_Query($query_string); 
remove_filter('posts_where', 'filter_where'); 
+0

Tak, widziałem to, ale wydaje się, że ten argument jest dozwolony dla statusu postu, tj. Post_status = protected będzie obejmować wszystkie chronione statusy, chyba że używam go niepoprawnie? – Kevin

+0

Po prostu spekulujesz, ale czy próbowałeś post_status = -protected? – vzwick

+0

Tak, próbowałem, ale to też nie działa – Kevin

1

Po trochę gra o, znalazłem filtr posts_where trochę zbyt nachalny w stosunku do tego, co chciałem zrobić, więc wymyśliłem alternatywę. W ramach akcji "save_post", którą dodałem do mojego niestandardowego typu postu, dodałem następującą logikę;

To, co się dzieje, to przytrzymanie tablicy identyfikatorów postów w tabeli opcji, w której post jest chroniony hasłem. Następnie w zapytaniu niestandardowym po prostu przekazałem tę tablicę jako część opcji, np. post__not_in

$query = new WP_Query(array(
    'post_type' => 'my_custom_post_type', 
    'post__not_in' => get_option('__protected_posts'), 
)); 

W ten sposób mogę wykluczyć chronione posty ze strony archiwum, ale nadal zezwalać użytkownikowi na wylądowanie na stronie chronionej hasłem w celu wprowadzenia hasła.

+0

to działało dla mnie tam, gdzie "lepsze" rozwiązanie poniżej nie miało miejsca. Używałem get_posts, więc był to najprostszy sposób na wykonanie zadania. –

9

Bardzo podoba mi się podejście Kevina, ale dostosować ją nieco:

// Create a new filtering function that will add our where clause to the query 
function my_password_post_filter($where = '') { 
    // Make sure this only applies to loops/feeds on the frontend 
    if (!is_single() && !is_admin()) { 
     // exclude password protected 
     $where .= " AND post_password = ''"; 
    } 
    return $where; 
} 
add_filter('posts_where', 'my_password_post_filter'); 
+1

To zadziałało dla mnie, dzięki Peter. –

+0

Dzięki, @Peter Chester, dodałem także to wykluczenie do linków 'Next Post' i' Previous Post' (zobacz moją odpowiedź). – Nelu

+0

Każdy pomysł, jak zastosować to, aby przekazywać chronione posty w niestandardowych pętlach na jednym? –

0

Oprócz @Peter Chester odpowiedź:

Można też wykluczyć chronione hasłem posty z Previous Post i Next Post linki, jeśli masz je na dole strony postu.

Aby to zrobić, można dodać wykluczenie do haków get_previous_post_where i get_next_post_where.

add_filter('get_previous_post_where', 'my_theme_mod_adjacent'); 
add_filter('get_next_post_where', 'my_theme_mod_adjacent'); 
function my_theme_mod_adjacent($where) { 
    return $where . " AND p.post_password = ''"; 
} 
2

Podchodzę do tego pytania, gdzie szukałem tego samego. Jednak czytałem WP_Query dokument linia po linii, a następnie znaleźć bardzo proste rozwiązanie i że jest po prostu dodać 'has_password' => false argumentu do zapytania $args

Więc kod będzie jak poniżej ...

$args = [ 
    'post_type'  => [ 'post', 'page' ], 
    'posts_per_page' => 3, 
    'post__not_in' => get_option('sticky_posts'), 
    'has_password' => FALSE 
]; 

Tutaj można zobacz Wykluczam posty Sticky i Password Protected.

+1

Wszystkie odpowiedzi sugerujące używanie SQL są niebezpieczne i nie powinny być używane od wersji WordPress 3.9+. Jest to wbudowane w sposób wykluczający posty chronione hasłem. – sauv0168

Powiązane problemy