it-swarm.com.ru

Установить сообщения пользовательского типа сообщения по умолчанию как личные?

Скажем, я создал пользовательский тип записи под названием "Личные сообщения" ($post_type = itsme_private_posts) и хочу, чтобы все публикации с пользовательским типом публикации автоматически устанавливались в "Личные" при публикации, т.е. по умолчанию. Как мне это сделать?

Основываясь на @ brasofilo ответе на связанный вопрос о StackOverflow , я попытался это:

add_filter( 'wp_insert_post_data', 'itsme_cpt_private', '99', 2 );
function itsme_cpt_private( $data , $postarr ) {
    if( $postarr['post_type'] == 'itsme_private_posts' ) {
        $data['post_status'] = 'private';
    }
    return $data;
}

Это не работает, то есть ничего не делает; все так, как было до добавления функции. Как будто функция не существует или просто ничего не делает.

Затем, основываясь на этой статье под заголовком " Принудительно сделать пользовательский тип записи частным ", я попытался сделать следующее:

add_filter( 'wp_insert_post_data', 'itsme_cpt_private' );
function itsme_cpt_private( $post ) {
    if( $post['post_type'] == 'itsme_private_posts' ) {
        $post['post_status'] = 'private';
    }
    return $post;
}

Это работает, когда я публикую или обновляю сообщение, оно становится приватным. Хорошо! Но когда я создаю новый пост ("Добавить новый") и ухожу, ничего не делая, он создает "приватный" (авто) черновик и сохраняет его. Более того, я не могу даже испортить эту вещь!

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

5
its_me

Проблема с кодом в вашем вопросе заключается в том, что он {всегда перехватывает. Вы полностью потеряете способность не публиковать, черновики невозможны. Почему это приводит к неразрывной записи, я больше не проверял. Во всяком случае, это не то, что нужно.

Я рад, что решение javascript работает для вас, но лично у меня есть две проблемы, first, вы можете сохранить сообщение как общедоступное, second, это усложняет - потому что скрипт всегда устанавливает переключатель в приватное состояние - для работы с черновиками. В некотором смысле, теперь есть два решения для ответа.


1. Принудительный выбор типа сообщения и визуальная индикация:

Вот почему я по-другому взглянул на то, как это делается с переходами статуса поста, и, как я уже сказал, это можно сделать с помощью Переходы статуса поста .

Код:

add_action( 'transition_post_status', 'wpse118970_post_status_new', 10, 3 );
function wpse118970_post_status_new( $new_status, $old_status, $post ) { 
    if ( $post->post_type == 'itsme_private_posts' && $new_status == 'publish' && $old_status  != $new_status ) {
        $post->post_status = 'private';
        wp_update_post( $post );
    }
} 

Это сила опубликованные посты вашего типа поста, чтобы быть частными. Не мешая возможности сохранять черновики. Это само по себе было бы достаточно, чтобы решить проблему с личным типом поста.
Но, конечно, было бы неплохо, чтобы личный тип сообщения был представлен в метабоксе публикации. Для этого я немного подкорректировал JavaScript. Главным образом, не устанавливая флажок по умолчанию, но по-прежнему изменяя отображаемый текст, дополнительно я добавил примечание.

Код:

add_action( 'post_submitbox_misc_actions' , 'wpse118970_change_visibility_metabox' );
function wpse118970_change_visibility_metabox(){
    global $post;
    if ($post->post_type != 'post')
        return;
        $message = __('<strong>Note:</strong> Published posts are always <strong>private</strong>.');
        $post->post_password = '';
        $visibility = 'private';
        $visibility_trans = __('Private');
    ?>
    <style type="text/css">
        .priv_pt_note {
            background-color: lightgreen;
            border: 1px solid green;
            border-radius: 2px;
            margin: 4px;
            padding: 4px;
        }
    </style>
    <script type="text/javascript">
        (function($){
            try {
                $('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
                $('#hidden-post-visibility').val('<?php echo $visibility; ?>');
            } catch(err){}
        }) (jQuery);
    </script>
    <div class="priv_pt_note">
        <?php echo $message; ?>
    </div>
    <?php
}

Источник: Как настроить видимость новых сообщений как конфиденциальную по умолчанию?
Примечание: По сравнению с приведенным ниже кодом я снял отметку с переключателя и дополнительно добавил код для сообщения.

Конечно, вам не нужен javascript, чтобы сделать ваш тип поста приватным, но всегда приятно, когда что-то отображается визуально. По этой причине это хорошее дополнение.


2. Сделать приватную стандартную опцию в метабоксе публикации:

Я держу это, потому что @its_me принял ответ для этого как решение. Как я уже сказал в комментарии, я нашел полезный фрагмент кода, он заботится о настройке видимости в метабоксе как приватной, подключившись к post_submitbox_misc_actions . Как я уже говорил в начале: "У меня две проблемы с этим, во-первых, вы можете сохранить сообщение как общедоступное, во-вторых, это усложняет задачу - потому что скрипт всегда устанавливает переключатель в частное состояние - для работы с черновиками". Все еще возможно иметь и работать с черновиками, но не так интуитивно, как раньше, но статус частной публикации никоим образом не поддерживается.

Код:

add_action( 'post_submitbox_misc_actions' , 'wpse118970_change_visibility_metabox_value' );
function wpse118970_change_visibility_metabox_value(){
    global $post;
    if ($post->post_type != 'itsme_private_posts')
        return;
    $post->post_password = '';
    $visibility = 'private';
    $visibility_trans = __('Private');
    ?>
    <script type="text/javascript">
        (function($){
            try {
                $('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
                $('#hidden-post-visibility').val('<?php echo $visibility; ?>');
                $('#visibility-radio-<?php echo $visibility; ?>').attr('checked', true);
            } catch(err){}
        }) (jQuery);
    </script>
    <?php
}

Источник: Как настроить видимость новых сообщений как конфиденциальную по умолчанию?
Примечание: Я сократил код, чтобы соответствовать потребностям здесь.

13
Nicolai

Основываясь на ответе выше, вот то, к чему я пришел, с клиентской (javascript) частью:

add_action( 'post_submitbox_misc_actions' , 'ourcpt_change_visibility_metabox' );
function ourcpt_change_visibility_metabox() {
  global $post;
  if ( 'ourcpt' != $post->post_type ) { return; }
  //else          
  $post->post_password = '';
  ?>
  <script type="text/javascript">
      (function($){
          try {
              $( "<div class='misc-pub-section'><em>(when it's published, the status becomes private)</em></div>" ).insertAfter( $('#post-visibility-select') );
              $('a.edit-visibility').css({'display': 'none'});
          } catch(err){}
      }) (jQuery);
  </script>
  <?php
}

Потому что я люблю видеть, что именно происходит со статусом. Код для add_filter( 'wp_insert_post_data' я использовал без изменений.

Большое спасибо за ваши решения!

0
Olga Farber

Это самый "стандартный" способ, который я нашел до сих пор, чтобы установить видимость постов по умолчанию:

function wp_118970_force_type_private($post) {
  if ($post['post_status'] != 'trash' && $post['post_status'] != "draft" && $post['post_status'] != "auto-draft") {
    $post['post_status'] = 'private';
  }
  return $post;
}
add_filter('wp_insert_post_data', 'wp_118970_force_type_private');

Обратите внимание, что вы должны убедиться, что post_status не является "мусором", иначе вы не сможете удалить свое сообщение. Мы также проверяем состояние "черновик" и "черновик", чтобы не изменять сообщения как "личные" при их редактировании.

При этом нет необходимости добавлять JS, видимость будет установлена ​​на частный с самого начала.

Если вы хотите настроить таргетинг на определенный тип поста, вы можете сделать это следующим образом:

function wp_118970_force_type_private($post) {
  if ($post['post_status'] != 'trash' && $post['post_status'] != "draft" && $post['post_status'] != "auto-draft" && $post['post_type'] == 'my_post_type') {
    $post['post_status'] = 'private';
  }
  return $post;
}
add_filter('wp_insert_post_data', 'wp_118970_force_type_private');

Сначала я нашел решение здесь: http://wpsnipp.com/index.php/functions-php/force-custom-post-type-to-be-private/

0
Jonathan Pasquier