Как исключить защищенные паролем сообщения в цикле WordPress - PullRequest
5 голосов
/ 24 сентября 2011

У меня есть пользовательский тип записи, который поддерживает записи, защищенные паролем. В пользовательском цикле с использованием нового объекта WP_Query я хочу исключить эти защищенные паролем сообщения из результатов. Какие аргументы мне нужно установить, чтобы сделать это? Я использую последнюю версию транка WordPress 3.2.1.

Ответы [ 5 ]

8 голосов
/ 25 июня 2012

Мне очень нравится подход Кевина, но я немного его скорректировал:

// 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' );
7 голосов
/ 14 апреля 2017

Я подхожу к этому вопросу, где я искал то же самое.Тем не менее, я построчно читал документ WP_Query, а затем нашел очень простое решение, которое заключается в добавлении 'has_password' => false аргумента к запросу $args

, поэтому код будет таким, как показано ниже ...

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

Здесь вы видите, что я исключил сообщения Sticky и Password Protected.

1 голос
/ 28 апреля 2014

В дополнение к ответу @Peter Chester:

Вы также можете исключить сообщения, защищенные паролем, из ссылок Previous Post и Next Post, если они есть в нижней части страницы сообщения.

Для этого вы можете добавить исключение к хукам get_previous_post_where и 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 = ''";
}
1 голос
/ 25 сентября 2011

Немного поиграв, я обнаружил, что фильтр posts_where слишком навязчив для того, что я хотел сделать, поэтому я нашел альтернативу. В рамках действия «save_post», которое я прикрепил для своего пользовательского типа записи, я добавил следующую логику:

$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);

Это удерживает массив идентификаторов постов в таблице параметров, где пост защищен паролем. Затем в пользовательском запросе я просто передал этот массив как часть опции post__not_in, например

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

Таким образом, я мог бы исключить защищенные записи со страницы архива, но все же позволить пользователю войти на защищенную паролем страницу для ввода пароля.

1 голос
/ 24 сентября 2011

Вы смотрели на аргумент post_status WP_Query?

«Защищенный» кажется хорошим кандидатом для исключения.

Редактировать: Хорошо, похоже, вам придется изменить предложение where для достижения того, что вы хотите:

// 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' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...