CPT-Vorlage wird nicht angezeigt - 404 erhalten


8

Ich entwickle ein Custom Post Type Plugin, das in dev gut funktioniert. Nachdem ich es in die Produktion verschoben habe, erhalte ich eine 404, wenn ich versuche, die Vorlage für das CPT anzuzeigen.

Also zwei Fragen:

1- Gibt es einen Mechanismus, um den Weg zu bestimmen, den WP genommen hat, um durch die Hierarchie zu gelangen?

2- Warum gibt es mir nicht einfach die Einzel- oder Indexseite?

Ich habe $ wp_query und einen Stacktrace am Ende des 404 ausgegeben. Hier ist ein Teil dessen, was ich gefunden habe:

[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

Und die Stapelverfolgung:

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

Danke für Ihre Hilfe.

Antworten:


14

Löschen Sie immer die Umschreiberegeln, wenn Sie einen neuen öffentlichen Beitragstyp oder eine neue Taxonomie registrieren. Andernfalls berücksichtigen die internen Umschreiberegeln dies nicht, wenn eine URL einer Abfrage zugeordnet wird.

Sie können diesen Prozess automatisieren, indem Sie sich in registered_post_typeund einbinden registered_taxonomy.

Unten finden Sie den aktualisierten Code, der auf dem Feedback von Kommentaren und anderen Personen basiert.

Als Plugin herunterladen T5 Silent Flush auf GitHub.

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 );
}

Dadurch werden die Regeln jedes Mal gelöscht, wenn Sie einen neuen Beitragstyp oder eine neue Taxonomie erstellen. Sie müssen die Permalink-Einstellungen nicht erneut aufrufen.


Ich denke darüber nach, dies dem CPT-Plugin selbst hinzuzufügen. Es scheint nicht sinnvoll zu sein, von einem Benutzer ein anderes Plugin zu verlangen, damit mein Plugin funktioniert.
NotoriousWebmaster

Ja natürlich. Ich wollte nur anderen Lesern mit dem gleichen Problem ein wiederverwendbares Beispiel geben.
Fuxia

8
Klingt so, als ob dies im Kern sein sollte
Scott Kingsley Clark

Hatte ein paar Fragen dazu: Wird dies so ressourcenintensiv sein wie das Löschen der Umschreiberegeln und wird dies jedes Mal ausgeführt, wenn WP geladen wird?
Manny Fleurmond

@MannyFleurmond Ja, es wird jedes Mal ausgeführt, wenn der Beitragstyp registriert wird. Die Regeln werden jedoch nur bei Bedarf gelöscht, und der get_option()Wert stammt aus dem Cache.
Fuxia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.