如何将CPT与正规岗位区分开来?

时间:2013-04-28 作者:NotoriousWebmaster

我刚刚开始填充我的CPT。我想把它和普通的帖子分开。但当我去查看常规帖子(在single.php 模板),上一个/下一个nav包括CPT职位。

有趣的是,CPT帖子不会出现在主页列表上。

更新:我正在使用get_previous_post_join, get_previous_post_where, get_previous_post_sort 筛选器及其下一个对应项。这些似乎影响了所有的导航。如何将它们约束为仅影响所需的页面?

更新2:因此,我在下面的回答中对代码进行了更改(将get\\u previous/next\\u post\\u*过滤器封装在一个函数中,我在循环之前从CPT单模板调用了该函数。这是插件中的代码:

     function aaaConsultant_set_nav_filters() {
        add_filter(\'get_previous_post_join\', \'aaaConsultant_get_previous_post_join_custom_sort\');
        add_filter(\'get_previous_post_where\', \'aaaConsultant_get_previous_post_where_custom_sort\');
        add_filter(\'get_previous_post_sort\', \'aaaConsultant_get_previous_post_sort_custom_sort\');

        add_filter(\'get_next_post_join\', \'aaaConsultant_get_next_post_join_custom_sort\');
        add_filter(\'get_next_post_where\', \'aaaConsultant_get_next_post_where_custom_sort\');
        add_filter(\'get_next_post_sort\', \'aaaConsultant_get_next_post_sort_custom_sort\');
    }

    function aaaConsultant_get_previous_post_join_custom_sort($join) {
        global $wpdb;
        return "INNER JOIN {$wpdb->prefix}postmeta ON (p.ID = {$wpdb->prefix}postmeta.post_id)";
    }
    function aaaConsultant_get_previous_post_where_custom_sort($where) {
        global $wpdb, $post;
        $meta_value = get_post_meta($post->ID, \'aaaConsultant_dateofletter\', true);
        return "WHERE 1=1  AND p.post_type = \'refletter\' AND p.post_status = \'publish\' AND {$wpdb->prefix}postmeta.meta_key = \'aaaConsultant_dateofletter\' AND {$wpdb->prefix}postmeta.meta_value < \'{$meta_value}\'";
    }
    function aaaConsultant_get_previous_post_sort_custom_sort($sort) {
        global $wpdb;
        return "ORDER BY {$wpdb->prefix}postmeta.meta_value DESC LIMIT 1";
    }

    function aaaConsultant_get_next_post_join_custom_sort($join) {
        global $wpdb;
        return "INNER JOIN {$wpdb->prefix}postmeta ON (p.ID = {$wpdb->prefix}postmeta.post_id)";
    }
    function aaaConsultant_get_next_post_where_custom_sort($where) {
        global $wpdb, $post;
        $meta_value = get_post_meta($post->ID, \'aaaConsultant_dateofletter\', true);
        return "WHERE 1=1  AND p.post_type = \'refletter\' AND p.post_status = \'publish\' AND {$wpdb->prefix}postmeta.meta_key = \'aaaConsultant_dateofletter\' AND {$wpdb->prefix}postmeta.meta_value > \'{$meta_value}\'";
    }
    function aaaConsultant_get_next_post_sort_custom_sort($sort) {
        global $wpdb;
        return "ORDER BY {$wpdb->prefix}postmeta.meta_value ASC LIMIT 1";
    }
这是模板中的代码:

<?php 
aaaConsultant_set_nav_filters();
if (have_posts()) : while (have_posts()) : the_post(); ?>
问题是,经常发布的帖子以单条形式出现。php,但nav返回到帖子列表的开头,不会遍历整个列表。不确定这是由什么引起的。将尝试停用插件,看看有什么效果。

此外,对于这个问题是应该放在一个新问题中,还是应该添加到这个问题中,这也是一个困惑,因为这显然是nav变化的影响。(我想,“显然”还没有得到证实。)

更新3:所以,停用了插件,在常规帖子中仍然存在导航问题。这些是通过演示数据创建者生成的。但是,当我决定重命名CPT时,我对wp\\U POST和wp\\U POSTETA表进行了一些手动更改。因此,这些问题可能是这种混乱的结果。

我想我会去掉生成的帖子并重新生成。

更新4:是的,更新帖子似乎已经解决了这个问题。我们将把它归因于我自己笨拙的数据库操作。不确定是否要删除更新3和4(也可能要删除更新2)。我会把这个交给StackExchange的智者们。

2 个回复
SO网友:NotoriousWebmaster

问题是get\\u previous/next nav过滤器在插件中是“公开的”;因此,每次加载插件时都会执行它们。我将它们放在一个名为myplugin\\u set\\u nav\\u filters()的函数中,我在CPT单模板中的循环之前调用了该函数,所有内容都按照公布的方式工作。

现在,常规岗位上的nav不再被CPT岗位过滤;CPT页面正在获取所需的过滤器。

我希望这对某人有所帮助。

SO网友:Manny Fleurmond

它包含所有内容的主要原因是您的自定义排序代码已设置为适用于所有内容。它根本没有被过滤所以在where 放置位置的函数AND p.post_type = \'refletter\' 它添加了post类型refletter 到每个上一个和下一个链接。

您应该做的是为每个函数添加一个过滤器,使其仅在您处于该帖子类型的帖子中时工作:

function aaaConsultant_get_previous_post_join_custom_sort($join) {
        global $wpdb, $post;  //globalize $post
        if( $post->post_type !== \'refletter\' ) return //returns if the custom post type isn\'t correct
        return "INNER JOIN {$wpdb->prefix}postmeta ON (p.ID = {$wpdb->prefix}postmeta.post_id)";
    }
在所有功能中这样做将解决您的问题

结束

相关推荐

Get_Posts()中的Tax_Query是否不起作用?

我正试图打印出每个分类法中的所有帖子,其中包含一个名为product (jigoshop产品)。所以我用$cats = get_terms(\'product_cat\');, 然后我循环遍历它们,并获得分类法中的所有帖子。问题是,它不起作用。它只是返回空白!$uposts = get_posts(array( \'post_type\' => \'product\', \'numberposts\' => -1, \'tax_query\' =