Автоматически устанавливайте пароль по умолчанию для всех сообщений в определенной категории


Допустим, у нас есть категория со слизняком protected_category и некоторыми сообщениями в ней. Есть ли способ заставить все сообщения в этой категории быть защищенными паролем с использованием пароля по умолчанию?

ОБНОВЛЕНИЕ: Я нашел решение, как установить пароль по умолчанию для всех сообщений в пользовательском типе сообщения:

add_filter( 'default_content', 'set_default_values', 10, 2 );
function set_default_values( $post_content, $post ) {
    if ( $post->post_type )
        switch ( $post->post_type ) {
            case 'protected_post':
                $post->post_status = 'protected';
                $post->post_password = '123123';
                break;
        }

    return $post_content; 
}

Итак, как я могу изменить это, чтобы оно предназначалось для определенной категории?

Author: tfrommen, 2014-02-20

1 answers

Это должно делать то, что вы хотите:

add_filter('save_post', 'wpse_135377_protect_post');
function wpse_135377_protect_post($post_ID) {
    if (in_array(
        'protected_category',
        wp_get_post_categories($post_ID, array('fields' => 'slugs'))
    )) {
        // we have to remove the function
        // as it will be called by `wp_update_post` (=> infinite loop)
        remove_filter('save_post', 'wpse_135377_protect_post');
        wp_update_post(array(
            'ID' => $post_ID,
            'post_password' => '123123',
        ));
        // now we add it again
        add_filter('save_post', 'wpse_135377_protect_post');
    }
} // function wpse_135377_protect_post

В вашей базе кода было несколько проблем:

  • нет статуса публикации protected - сообщения, защищенные паролем, также имеют статус публикации publish (и у них есть пароль);
  • вы должны использовать действие save_post (как предложено в приведенном ниже комментарии и связанном ответе);
  • объект $post, который передается в функции (save_post, а также default_content), не указатель (ссылка), поэтому все, что вы делаете, чтобы объект остается внутри функции (если вы не вставите его в базу данных).

Счастливой защиты!

 1
Author: tfrommen, 2014-02-21 11:58:42