是否将自定义帖子类型的帖子默认设置为私人帖子?

时间:2013-10-15 作者:its_me

假设我创建了一个名为“私人帖子”的自定义帖子类型($post_type = itsme_private_posts) 并希望自定义帖子类型下的所有帖子在发布时(即默认情况下)自动设置为“私有”。我该怎么做?

基于@brasofilo\'s answer to a related question on 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;
}
它不起作用,也就是说,它什么都不做;一切都是添加函数之前的样子。这就好像函数不存在或者什么都不做一样。

然后,根据这篇题为Force custom post type to be private“,我试过:

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;
}
在这方面,当我发布或更新一篇文章时,它会变成私有的。好的但当我创建一个新帖子(“添加新帖子”)并且什么都不做就离开时,它会创建一个“私有”(自动)草稿并保存它。而且我连那东西都不能扔掉!

基本上我不知道怎么做。那么,如何将自定义帖子类型的帖子默认设置为私有?

3 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

您问题中的代码的问题是它总是拦截。您完全失去了不发布、不可能有草稿的能力。我并没有进一步研究为什么这会导致一篇不可删减的文章。无论如何,这不是一个人想要的。

我很高兴javascript解决方案能为您服务,但就我个人而言,我有两个问题,第一个问题,您可以将帖子另存为public,第二个问题,这使得处理草稿变得更加困难,因为脚本总是将单选按钮设置为private。在某种程度上,现在有两种解决方案。


1。将帖子类型强制为私有加上视觉指示:

这就是为什么我再次研究如何使用帖子状态转换,正如我所说,可以使用Post Status Transitions.

Code:

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。主要是通过默认情况下不设置复选框,但仍然更改显示的文本,另外我添加了一个注释。

Code:

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
}
Source: How to set new posts visibility to private by default?
Note: 与下面的代码相比,我删除了单选按钮的检查,并为消息添加了额外的代码。

当然,您不需要javascript来将您的post类型设置为私有,但将内容直观地指示出来总是很好的。因此,这是一个很好的补充


2。将private作为发布元框中的标准选项:

我保留这个选项,因为@its\\me接受了这个答案作为解决方案。正如我在评论中所说,我发现了一段有用的代码,它通过挂接post_submitbox_misc_actions. 正如我在开始时所说的,我有两个问题,第一,你可以将帖子保存为public,第二,它使处理草稿变得更加困难,因为脚本总是将单选按钮设置为private。仍然可以拥有并使用草稿,只是不像以前那样直观,但私人出版状态是无法强制执行的。

Code:

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
}
Source: How to set new posts visibility to private by default?
Note: 我缩短了代码以适应这里的需要。

SO网友:Jonathan Pasquier

这是迄今为止我发现的将帖子可见性默认设置为私有的最“标准”的方法:

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\\u状态不是“垃圾”,否则您将无法删除您的帖子。我们还检查“草稿”和“自动草稿”状态,以避免在编辑帖子时将帖子设置为“私有”。

这样,就不需要添加一些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/

SO网友:Olga Farber

根据上面的答案,以下是我对客户端(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\' 我使用的是不变的。

非常感谢您的解决方案!

结束

相关推荐

修改Precision_Posts链接以使用AJAX

我正在编辑wp-includes/link-template.php 文件,并希望使用Ajax将帖子加载到我的ID中#box-right. 我知道有很多插件可以使用,但我使用自己的HTML和CSS布局,包括帖子(没有将我的网站与WordPress集成)。我正在使用AJAX加载网站中某些DIV中的内容,我需要更改以下代码以将帖子加载到我的box right DIV中。return \'<a href=\"\' . previous_posts( false ) . \"\\\" $attr>\"