2011-09-24 16 views
5

Ho un tipo di messaggio personalizzato che supporta voci protette da password. In un ciclo personalizzato utilizzando un nuovo oggetto WP_Query, desidero escludere i post protetti da password dai risultati. Quali argomenti ho bisogno di impostare per fare questo? Sto usando l'ultima versione trunk di WordPress 3.2.1.Come escludere i post protetti da password nel ciclo WordPress

+0

Da WordPress 3.9 esiste anche un argomento di query 'has_password' che è possibile utilizzare. –

risposta

1

Hai dato un'occhiata allo post_status argument di WP_Query?

"Protetto" sembra un buon candidato da escludere.

Edit: Va bene, sembra che si dovrà modificare la clausola WHERE per ottenere ciò che si vuole:

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

Sì, l'ho visto, ma sembra che l'argomento sia permissivo dello stato dei post, post_status = protected includerà tutti gli stati protetti, a meno che non lo utilizzi in modo errato? – Kevin

+0

Sto solo speculando, ma hai provato post_status = -protected? – vzwick

+0

Sì, l'ho provato ma non funziona neanche – Kevin

1

Dopo un po 'di giocare su, ho trovato il filtro posts_where un un po 'troppo invadente per quello che volevo fare, quindi ho trovato un'alternativa. Nell'ambito dell'azione "save_post" che ho allegato per il mio tipo di post personalizzato, ho aggiunto la seguente logica;

$visibility = isset($_POST['visibility']) ? $_POST['visibility'] : ''; 
$protected = get_option('__protected_posts', array()); 

if ($visibility === 'password' && !in_array($post->ID, $protected)) { 
    array_push($protected, $post->ID); 
} 
if ($visibility === 'public' && in_array($post->ID, $protected)) { 
    $i = array_search($post->ID, $protected); 
    unset($protected[$i]); 
} 
update_option('__protected_posts', $protected); 

Ciò che fa è contenere una matrice di post id nella tabella delle opzioni in cui il post è protetto da una password. Quindi, in una query personalizzata, ho semplicemente passato questo array come parte dell'opzione post__not_in ad es.

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

questo modo ho potuto escludere i messaggi protetti da una pagina di archivio, ma ancora permettere ad un utente di atterrare sulla pagina protetta da password per inserire la password.

+0

questo ha funzionato per me, dove la soluzione "migliore" di seguito non ha funzionato. stavo usando get_posts quindi questo era davvero il modo più semplice per portare a termine il lavoro. –

9

Mi piace molto l'approccio di Kevin, ma ho regolato leggermente:

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

Questo ha funzionato alla grande per me, grazie Peter. –

+0

Grazie, @Peter Chester, ho anche aggiunto questa esclusione per i link 'Next Post' e' Previous Post' (vedi la mia risposta). – Nelu

+0

Qualche idea su come applicare questo per passare post protetti in loop personalizzati su un singolo? –

0

Oltre a @Peter risposta di Chester:

Si consiglia inoltre di escludere i messaggi protetti da password dal Previous Post e Next Post collegamenti, se ne hai in fondo alla pagina del tuo post.

Per fare ciò è possibile aggiungere l'esclusione ai ganci get_previous_post_where e 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

Vengo a questa domanda in cui stavo cercando lo stesso. Tuttavia, ho letto WP_Query documento riga per riga poi trovato soluzione molto semplice e che è solo per aggiungere 'has_password' => false argomento alla query $args

Quindi il codice sarà, come di seguito ...

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

Qui puoi vedi Ho escluso i post Sticky e Password Protected.

+1

Tutte le risposte che suggeriscono l'uso di SQL sono pericolose e non dovrebbero essere utilizzate a partire da WordPress 3.9+. Questo è il modo integrato di escludere i post protetti da password. – sauv0168

Problemi correlati