Это довольно странная проблема. Я создаю пользовательский тип записи WordPress в файле functions.php моей темы, используя следующий формат:
add_action('init', 'product_register');
function product_register() {
$args = array(
'label' => __('Products'),
'singular_label' => __('Product'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type( 'product' , $args );
}
Это дает мне следующую структуру URL-адресов для моих продуктов: http://www.mywebsite.com/products/product-name.
Однако, если я переключаюсь на другую тему (TwentyTen), а затем переключаюсь обратно, WordPress забывает постоянную ссылку, теперь, когда я перехожу по указанному выше URL-адресу, я получаю свою страницу 404.
Действительно странная вещь, которую я заметил, заключается в том, что я могу решить эту проблему, перейдя в «Настройки» -> «Постоянные ссылки» в админке. Это временно устраняет проблему до следующего удаления/переустановки темы.
У кого-нибудь еще была похожая проблема?
Это не проблема. То, что вы описали, это нормально. И здоровый.
Кроме того, это, вероятно, была просто опечатка, но, учитывая код, который вы вставили, в приведенном выше URL должно быть указано
/product/
not/products/
.Эй, Джон, да, это опечатка. Пример URL-адреса должен быть mywebsite.com/product/product-name.
Я не понимаю, почему WP забывает постоянную ссылку для CPT. Конечно, когда я переустановлю свою тему, functions.php должен построить cpt и заставить постоянные ссылки работать должным образом?
Я не ценю отрицательный голос за опечатку. Эта проблема все еще остается проблемой для меня, и мне нравится, когда кто-то помогает понять, как ее исправить.
Спасибо! Это объясняет, почему переход в «Настройки» -> «Постоянные ссылки» исправляет это при вызове flush_rules(). Можете ли вы сказать мне, как мне настроить мою тему и CPT, чтобы пользователи могли удалять и переустанавливать без этой проблемы? Я думаю, помещать WP_Rewrite::flush_rules() в functions.php — плохая идея?
Или я должен задать это как отдельный вопрос?
@trnsfrmr: Большинство людей помещают такой код в плагин, а затем подключаются к активации этого плагина через
register_activation_hook()
. Это позволит «пережить» изменения темы. Если вы действительно хотите, чтобы это было в вашей теме, вы можете попробовать подключиться кswitch_theme
действию.Нет необходимости, я исправил проблему, используя следующую строку после вызова register_post_type: flush_rewrite_rules(false);
@trnsfrmr: это работает, но не рекомендуется, потому что требуется некоторое время, чтобы очистить базу данных, пересчитать правила и снова их сохранить. Даже если вы не выполняете «жесткую» очистку (записываете их в
.htaccess
), для этого требуются операции с базой данных. Так что использование «правильных» хуков активации действительно окупается.Новая структура постоянной ссылки сохраняется только при
WP_Rewrite::flush_rules()
вызове. Поскольку это дорогостоящая операция (вычисление новых правил и сохранение их в базе данных), ее не следует делать при каждомinit
вызове, а только при изменении структуры. Пользовательский тип сообщения, однако, должен быть зарегистрирован при каждомinit
вызове, так как он сохраняется в массиве PHP в памяти, а не в базе данных (именно поэтому он забыл о пользовательском сообщении при переключении тем: структура постоянной ссылки все еще существовала, но ссылалась на пользовательский тип сообщения, который не был загружен, выдавая ошибку).