Permanent Custom Post Type

时间:2017-07-19 作者:spriore

我假设WP的底层数据库中有一个表,如何向其中添加自定义的post类型。

一、 我不想在每个页面上都加载,我希望能够在页面上使用slug和post类型的查询。

function cptui_register_my_cpts_app() {

    $labels = array();
    $args = array();
    register_post_type( "app", $args );
}

add_action( \'init\', \'cptui_register_my_cpts_app\' );
更具体地说,如果成员尚未登录,我希望能够创建从自定义帖子类型(在本例中为“app”)到登录页面的重定向。

function my_redirect() {
    if( !is_user_logged_in() && is_singular(\'app\') ) {
        wp_redirect( \'login page\' );
        exit();
    }
}
add_action(\'init\', \'my_redirect\');

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

内置的post类型定义不存储在数据库中,它们会在每个请求中注册,就像自定义类型一样。这是没办法的。

如果您只想尽早检查请求和登录状态,可以使用parse_request 措施:

function wpd_parse_request( $request ) {
    if( !is_user_logged_in() && isset( $request->query_vars[\'app\'] ) ){
        wp_redirect( wp_login_url() );
        exit();
    }
}
add_action( \'parse_request\', \'wpd_parse_request\' );

SO网友:Digvijayad

自定义帖子类型自动存储在wp_posts 表以及所有其他员额。但是,您不能使用所有常规查询来访问它们。我相信这就是你要找的pre_get_posts 钩根据codex

此挂钩在创建查询变量对象之后,但在实际查询运行之前调用。pre\\u get\\u posts操作允许开发人员通过引用访问$query对象

下面是一个非常好的片段,它允许您对自定义帖子类型使用普通的帖子查询。从中找到here.(未经个人测试,我几天前见过。还没有机会尝试。)

/*
 * Extend wp search to include custom post meta 
 */

function custom_search_query( $query ) {
    if ( !is_admin() && $query->is_search ) {
        $query->set(\'meta_query\', array(
            array(
                \'key\' => \'__meta_key__\',
                \'value\' => $query->query_vars[\'s\'],
                \'compare\' => \'LIKE\'
            )
        ));
         $query->set(\'post_type\', \'__your_post_type__\'); // optional
    };
}
add_filter( \'pre_get_posts\', \'dc_custom_search_query\');
?>

SO网友:Cedon

您可以使用WP_Query 类和post_type 论点所以在你的情况下,机器可读的名称app 指定给您的自定义帖子类型:

$args = array(
    \'post_type\' => \'app\',
);

$my_query = new WP_Query( $args );
然后将其输入循环:

<?php

    if ( $my_query->have_posts() ) {
        while ( $my_query->have_posts() ) : $my_query->the_post(); ?>

        // Your Loop Code

        <?php endwhile; ?>

        <?php wp_reset_postdata(); ?>

    <?php else : ?>
        // No Posts Found Code
    <?php endif; ?>

?>
您可以使用其他参数进一步优化结果。只需确保您的自定义post类型声明public => true, 在其论点中。

也就是说,您对自定义帖子类型、任何相关自定义分类法等的定义实际上应该在插件中。这样,您可以随意交换主题,而无需孤立自定义帖子和分类法,或者每次都必须将代码移植到新主题中。

结束