Wordpress Custom Post Type бесконечный цикл перенаправления с использованием расширенных постоянных ссылок - PullRequest
0 голосов
/ 24 марта 2011

Используя Wordpress 3.1 и новейшие пользовательские интерфейсы Advanced Permalinks и Custom Post Type, я создал пользовательский тип записи под названием «people».Шаблон URL для всех детей этого типа записей - people / jim, однако, когда я просматриваю сообщение, я застреваю в бесконечном цикле перенаправления.Это происходит только тогда, когда я использую красивые постоянные ссылки, а не когда используются идентификаторы.

Структура постоянных ссылок, используемая в расширенных постоянных ссылках:

Общие настройки

Пользовательская структура:% postname%

Post

% postname%

  • Wordpress перенаправляет пользовательский тип записи на себя, а не переводит его как? People = jim.Я попытался определить типы постов самостоятельно в functions.php, а затем выполнить сброс, но, похоже, это не решает проблему, как обнаружили другие.Очень ценю любое исправление!

1 Ответ

1 голос
/ 09 июля 2011

После большого количества регистрации и отладки я обнаружил, что функция, которая вызывала бесконечное перенаправление, была function the_posts($posts). Если вы закомментируете все от if (is_single () && count ($posts) > 0) до remove_filter ('the_posts', array (&$this, 'the_posts'));, оно прекратит бесконечное перенаправление и, кажется, все еще работает нормально! Единственным побочным эффектом является то, что если вы перейдете на /jim/, он перенаправит вас обратно на /people/jim/ (а не просто даст вам 404). Для меня это было достаточно хорошо, так как это решило эту проблему.

Итак, снова, внутри advanced-permalinks.php, найдите function the_posts, а затем прокомментируйте его так, чтобы он выглядел как код ниже.

Почему это ломает это? Поскольку пользовательский тип записи is_single и не соответствует никаким правилам, очевидно, что заставляет APL отправлять его обратно для перенаправления ... бесконечно. Мля. Возможно, есть более умный способ сделать это, проверить, является ли это пользовательский тип записи, или что-то в этом роде, но мне просто показалось, что просто отключить его.

/**
 * Hook that is called when a post is ready to be displayed.  We check if the permalink that generated this post is the
 * correct one.  This prevents people accessing posts on other permalink structures.  A 301 is issued back to the original post
 *
 * @return void
 **/

function the_posts ($posts)
{

/* DISABLED CODE BELOW:

    // Only validate the permalink on single-page posts
    if (is_single () && count ($posts) > 0)
    {
        global $wp, $wp_rewrite;


        $id = $posts[0]->ID;  // Single page => only one post

        // Is this a migrated rule?
        $migrate = get_option ('advanced_permalinks_migration_rule');

        if ($migrate)
        {
            if (isset ($migrate[$wp->matched_rule]) && substr (get_permalink ($id), strlen (get_bloginfo ('home'))) != $_SERVER['REQUEST_URI'])
            {
                wp_redirect (get_permalink ($id));
                die ();
            }
        }
        else
        {
            // Get the permalink for the post
            $permalink = $this->get_full_permalink ($id);

            // Generate rewrite rules for this permalink
            $rules = $wp_rewrite->generate_rewrite_rules ($permalink);

            // THIS IS ESPECIALLY PROBLEMATIC PART FOR CUSTOM POSTTYPES

            // If the post's permalink structure is not in the rewrite rules then we redirect to the correct URL

            if ($wp->matched_rule && !isset ($rules[$wp->matched_rule]))
            {
                wp_redirect ( get_permalink ($id));
                die ();
            }
        }
    }
    DISABLED CODE ABOVE */

    remove_filter ('the_posts', array (&$this, 'the_posts'));
    return $posts;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...