CPT模板未显示-正在获取404


8

我正在开发一个自定义帖子类型插件,该插件在dev中可以正常工作。现在,我将其移至生产环境,尝试显示CPT模板时得到了404。

因此,有两个问题:

1-是否有某种机制来确定WP通过层次结构所采用的路径?

2-为什么不只给我单页或索引页?

我在404的末尾转储了$ wp_query和一个stacktrace。这是我发现的一部分:

[query] => Array
    (
        [page] => 
        [pagename] => refletters/proximity
    )

[request] => SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND (wp_posts.ID = '0') AND wp_posts.post_type = 'page'  ORDER BY wp_posts.post_date DESC 
[posts] => Array
    (
    )

[queried_object] => 
[queried_object_id] => 0

和堆栈跟踪:

2013-04-27 22:16:41 - 24.52.197.40 - TRACE - index.php - 404.php[39] - 
    wordpress/wp-content/themes/notoriousconsultant/404.php[39] - aaLog->logtrace
    wordpress/wp-includes/template-loader.php[50] - include
    wordpress/wp-blog-header.php[16] - require_once
    wordpress/index.php[17] - require

谢谢你的帮助。

Answers:


14

注册新的公共帖子类型或分类时,请始终刷新重写规则。否则,当URL映射到查询时,内部重写规则将不会考虑到这一点。

您可以通过钩住registered_post_type和来自动执行该过程registered_taxonomy

以下是根据评论和其他人的反馈更新的代码。

在GitHub上以插件T5 Silent Flush下载。

add_action( 'registered_post_type', 't5_silent_flush_cpt', 10, 2 );
add_action( 'registered_taxonomy',  't5_silent_flush_tax', 10, 3 );

/**
 * Flush rules for custom post types.
 *
 * @wp-hook registered_post_type
 * @param   string $post_type
 * @param   stdClass $args
 * @return  void
 */
function t5_silent_flush_cpt( $post_type, $args )
{
    if ( $args->_builtin )
        return;

    if ( ! $args->public )
        return;

    if ( ! $args->publicly_queryable )
        return;

    if ( ! $args->rewrite )
        return;

    $slug = $post_type;

    if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
        $slug = $args->rewrite['slug'];

    $rules = get_option( 'rewrite_rules' );

    if ( ! isset ( $rules[ $slug . '/?$'] ) )
        flush_rewrite_rules( FALSE );
}

/**
 * Flush rules for custom post taxonomies.
 *
 * @wp-hook registered_taxonomy
 * @param   string $taxonomy
 * @param   string $object_type
 * @param   array  $args
 * @return  void
 */
function t5_silent_flush_tax( $taxonomy, $object_type, $args )
{
    // No idea why we get an array here, but an object for post types.
    // Objects are easier to write, so ...
    $args = (object) $args;

    if ( $args->_builtin )
        return;

    if ( ! $args->public )
        return;

    if ( ! $args->rewrite )
        return;

    $slug = $taxonomy;

    if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
        $slug = $args->rewrite['slug'];


    $rules = get_option( 'rewrite_rules' );

    if ( ! isset ( $rules[ $slug . '/(.+?)/?$'] ) )
        flush_rewrite_rules( FALSE );
}

每当您创建新的帖子类型或分类法时,都会刷新规则。无需再次访问永久链接设置。


我正在考虑将其添加到CPT插件本身。要求用户拥有另一个插件才能使我的插件正常工作似乎没有任何意义。
NotoriousWebmaster

当然是。我只是想为其他遇到相同问题的读者提供一个可重用的示例。
fuxia

8
听起来像这样应该是核心
Scott Kingsley Clark

对此有一些疑问:这是否像刷新重写规则一样耗费资源,并且每次WP加载时都会运行吗?
Manny Fleurmond 2013年

@MannyFleurmond是的,它将在每次注册帖子类型时运行。但是仅在必要时才刷新规则,并且get_option()值来自缓存。
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.