启用贴纸以自定义POST_TYPE

时间:2013-07-21 作者:Toni Michel Caubet

我有一个自定义post\\u类型:tvr\\U公寓

function custom_post_apartment() {
        $labels = array(
            \'name\'                => \'Apartments\',
            \'singular_name\'       => \'Apartment\',
            \'add_new\'             => \'Add New\',
            \'add_new_item\'        => \'Add New Apartment\',
            \'edit_item\'           => \'Edit Apartment\',
            \'new_item\'            => \'New Apartment\',
            \'all_items\'           => \'All Apartments\',
            \'view_item\'           => \'View Apartment\',
            \'search_items\'        => \'Search Apartments\',
            \'not_found\'           => \'No apartments found\',
            \'not_found_in_trash\'  => \'No apartments found in trash\',
            \'parent_item_colon\'   => \'\',
            \'menu_name\'           => \'Apartments\'
        );

        $args = array(
            \'labels\' => $labels,
            \'public\' => true,
            \'query_var\' => true,
            \'rewrite\' => true,
            \'capability_type\' => \'post\',
            \'has_archive\' => true,
            \'hierarchical\' => false,
            \'menu_position\' => null,
            \'taxonomies\' => array(\'rf_apartment_feature\'),
            \'supports\' => array( \'title\', \'editor\', \'author\', \'thumbnail\', \'excerpt\' )
        );

        register_post_type( \'tvr_apartment\', $args );
    }
我想为它启用粘性贴子功能,

enter image description here

我在这里搜索:http://codex.wordpress.org/Function_Reference/post_type_supports

但我觉得这似乎不是一条路,有什么想法吗?

5 个回复
最合适的回答,由SO网友:Rarst 整理而成

根据广泛和长期运行的trac票据#12702, 自定义帖子类型不(也可能不会)支持粘性功能。

对于自定义站点中的CPT,可能不可能重复使用它(使用大量的复制粘贴和边缘案例),但在我看来,自定义解决方案(可能基于自定义字段)将是更实用和干净的方法。

SO网友:farinspace

我已经设法做到了以下几点。让我来描述一下这项技术,以便您可以决定是否使用它。

代码使用两个钩子,一个在放置“side”元框之前激发,另一个在发布元框的“date/time”部分之后激发。

第一个钩子(before)记录原始帖子类型,然后将其切换到“post”,wordpress认为这是一篇帖子,并设置特定于“post”帖子类型的默认字段。

第二个挂钩(后)会将立柱类型重置为原始类型。

如果任何人遇到任何问题,或出现任何无法预见的使用案例,而这种技术可能会失败,请务必回复。

// see /wp-admin/edit-form-advanced.php .. since wp 2.5.0
add_action( \'submitpost_box\', function() {
    // fyi .. unable to use "post_submitbox_minor_actions" action (/wp-admin/includes/meta-boxes.php) because $post_type is set early
    global $post;
    if ( isset( $post->post_type ) && in_array( $post->post_type, array( \'post_type_1\', \'post_type_2\' ) ) ) {
        echo \'before\'; // debug
        $post->post_type_original = $post->post_type;
        $post->post_type = \'post\';
    }
} );

// see /wp-admin/includes/meta-boxes.php .. since wp 2.9.0
add_action( \'post_submitbox_misc_actions\', function() {
    global $post;
    if ( isset( $post->post_type_original ) && in_array( $post->post_type_original, array( \'post_type_1\', \'post_type_2\' ) ) ) {
        echo \'after\'; // debug
        $post->post_type = $post->post_type_original;
        unset( $post->post_type_original );
    }
} );
Note: 上面介绍了如何将选项添加到UI中,您仍然需要在模板/输出中检查并使用粘性帖子。。类似以下内容(只是没有插件):

https://wordpress.stackexchange.com/a/185915/466

SO网友:Fanky

Edit 2022:您可以使用@Ray’s中提到的插件answer 现在已测试并似乎以本机方式保存粘滞属性,因此您可以使用。ignore_sticky_posts

Original Answer:

由于目前已有的用于此目的的插件都不支持WP5,因此一个简单(但不是很好)的解决方案是使用新的metabox。在您的CPT插件中:

add_meta_box(\'pseudosticky\', \'Is sticky\', \'addbox\', \'YOUR CUSTOM POST TYPE SLUG HERE\', \'normal\', \'high\');

function addbox($post, $metabox) {  
 $entered = get_post_meta($post->ID, \'pseudosticky\', true);
    ?>
    <label><input name="pseudosticky" type="checkbox"<?if($entered=="on")echo\' checked="checked"\';?>> Is sticky</label>
    <?
}
然后在查询中

  \'meta_query\' => array(
        array(
            \'key\' => \'pseudosticky\',
            \'value\' => "on",
            \'compare\' => \'=\'
        )
        //more meta conditions can be added here as arrays
  ),

SO网友:Ray

对于那些正在寻找的人,我可以确认此插件从WP版本5.9开始工作:https://wordpress.org/plugins/sticky-posts-switch/

SO网友:Deepak Kamat

我惊讶地发现这个功能仍然不可用。

我希望至少在WP_Query 我们可能会得到sticky_posts 然后你把身份证传给它,但它不在那里。

所以我做了这样的事情:

<?php 

$args = array( \'post_type\' => \'some_post_type\', \'posts_per_page\' => 20 , \'orderby\' => \'title\', \'order\'   => \'ASC\');

$loop = new WP_Query( $args );

$sticky_posts = array( 11462 ); // post ids for the posts you want to make sticky goes here

// Also need to show the sticky
while ( $loop->have_posts() ) : $loop->the_post(); 
  if ( in_array($post->ID, $sticky_posts) ):
    echo "I am STICKY!";
  endif;
endwhile; 


while ( $loop->have_posts() ) : $loop->the_post(); 
  if ( !in_array($post->ID, $sticky_posts) ):
      echo "I am not sticky :( ";
  endif;
endwhile; 
当然,这不是最好的解决方案,它有多个注意事项,但它适用于我的简单要求,即我只有一篇文章我想坚持到顶部。

问题/注意事项:

您必须修改有查询的代码块,并添加多个循环

结束

相关推荐

Print out last 3 blogposts

从一个问题到另一个问题,从迪斯科到迪斯科:P我的模板要求我在模板的标题中打印出最后3篇博客的标题。它的单页布局使这些博客帖子可以链接到页面上的帖子——就在下面的某个地方。。。自从我完成wordpress新手版以来,我已经需要帮助来创建整个单页布局:Single page themeModified home page query does not yield expected results长话短说-我创建了应用程序挂钩,将原始查询更改为包含所有页面。在我们开始解析页面之前,需要处理这些博客帖子。我的尝试