Intereting Posts
Допустимый размер памяти исчерпан. Решение для WordPress wpdb получить сообщения по таксономии SQL Пропустить идентификатор записи таблицы на другую страницу при нажатии Отображать избранные сообщения для пользовательского типа сообщений по таксономии Как настроить резервную копию wordpress в localhost? Использование заголовка страницы в качестве ссылки на терминологический архив Оптимизация и удаление изображений в WordPress Дополнительный текст на боковой панели для 1 пункта меню и его пунктов подменю? Создавать динамические страницы из внешних данных JSON без сохранения в базе данных? Обрезанная фатальная ошибка при обновлении 3.6 WP Group по годам (по убыванию)> месяц (по убыванию)> дата (по возрастанию) Как удалить связанные таблицы стилей из раздела главы, не удаляя их из каталога тем.? Заменить аудио / видео корпус проигрывателем? Googles jQuery: Есть ли преимущества для его использования? Могу ли я изменить форму контакта 7 на новую страницу?

Тип пользовательского сообщения WordPress 3.3 с /% postname% / permastruct?

Существует более ранняя публикация с похожим названием, но она не относится к WordPress 3.3, и это важно, поскольку 3.3 интересно рекламирует: «Использовать структуру постоянной ссылки postname без штрафа за производительность»

Проблема с WordPress 3.2 и ранее заключалась в том, что сначала он выглядел именами страниц, а затем 404. Сначала он не проверял произвольные типы сообщений. 3.3, с другой стороны, должны выглядеть типы сообщений, затем страницы и, наконец, 404 (как он рекламирует эту функцию). Это означает, что пользовательские типы сообщений без slug должны быть простыми , если они не жестко кодируют post_type=post где-нибудь.

Хотя я не могу найти 3.3-решение.

Вопрос : Как я могу определить permalink struct "/% postname% /" для любого заданного типа сообщений "xyz"?

Благодарю.

Solutions Collecting From Web of "Тип пользовательского сообщения WordPress 3.3 с /% postname% / permastruct?"

Это непросто сделать в WP 3.3, если вы не обманываете правила перезаписи, чтобы быть в правильном месте, и заставляете wp_rewrite думать, что в передней части используются вербальные правила. Ниже приведен класс ниже.

 class Test_Post_Type { const POST_TYPE = 'test'; public static function init() { global $wp_rewrite; $post_type_obj = register_post_type( self::POST_TYPE, array( 'labels' => array( 'name' => __( 'Tests' ), 'singular_name' => __( 'Test' ), 'add_new' => __( 'Add New' ), 'add_new_item' => __( 'Add New Test' ), 'edit_item' => __( 'Edit Test' ), 'new_item' => __( 'New Test' ), 'all_items' => __( 'All Tests' ), 'view_item' => __( 'View Test' ), 'search_items' => __( 'Search Tests' ), 'not_found' => __( 'No Tests found' ), 'not_found_in_trash' => __( 'No Tests found in Trash' ), 'menu_name' => __( 'Tests' ) ), 'publicly_queryable' => true, 'exclude_from_search' => true, 'hierarchical' => false, 'public' => true, 'rewrite' => false, 'has_archive' => true, 'supports' => array( 'title', 'editor', 'thumbnail', 'test_source' ), 'taxonomies' => array( 'category', 'post_tag' ), ) ); $post_type_obj = get_post_type_object(self::POST_TYPE); //register the rewrite tag for permalink building $wp_rewrite->add_rewrite_tag( '%' . $post_type_obj->query_var . '%', '([^/]+)', $post_type_obj->query_var . '=' ); //we have to add the permastruct here in order to build the permalink, otherwise we'll need to filter the post_type link add_permastruct(self::POST_TYPE, '%' . $post_type_obj->query_var . '%/', false ); //add a filter to remove the permastructs generated above add_filter(self::POST_TYPE . '_rewrite_rules', array(__CLASS__, '_remove_default_rules')); //now we add a filter to put the generated rewrite rules in the correct spot add_action('generate_rewrite_rules', array(__CLASS__, '_filter_rewrite_rules')); if(!is_admin()) { //we need verbose_page_rules to be on on the front end in order for pages to be process properly $wp_rewrite->use_verbose_page_rules = true; } } /** * Filter to remove the rules for this post type when they're automatically generated due to the permastruct registration * @param type $rules * @return type */ public static function _remove_default_rules($rules) { return array(); } /** * Filters the rules at the end to add back the ones for this post type at the bottom * @param WP_Rewrite $wp_rewrite */ public static function _filter_rewrite_rules($wp_rewrite) { $post_type_obj = get_post_type_object(self::POST_TYPE); $my_rules = $wp_rewrite->generate_rewrite_rules('%' . $post_type_obj->query_var . '%', EP_NONE); $wp_rewrite->rules += $my_rules; } } add_action( 'init', array( 'Test_Post_Type', 'init' ) ); 

Священные ключи от машины!

Я думаю, что это работает . Это почти работает, это супер просто, только одна строка:

 global $wp_rewrite; $args = array( 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug' => 'anything'), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','thumbnail') ); register_post_type('my_custom_post_type', $args); $wp_rewrite->add_permastruct('my_custom_post_type', "%my_custom_post_type%"); 

PS Если вы попробуете это дома, добавив эту строку. Перейдите в «Настройки» -> «Перманентные ссылки» и «Сохранить изменения», он обновит постоянные ссылки.

Я читал исходный код WP register_post_type() и нашел строку:

 $wp_rewrite->add_permastruct($post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask); 

Излишне говорить, но без пули я пришел к выводу, что он должен работать, и это было так . Даже редактирование постоянной ссылки под заголовком в редакторе работает правильно!

Обновление: это перерывы страницы, ссылки на чертежную доску …

Ответ prettyboymp почти тот же, что и вчера, но я не доволен этим. У отзыва prettyboymp есть один недостаток, он не работает, когда /% postname% / используется одновременно для нескольких типов сообщений.

Вот мой ответ, который также относится к текущей структуре и создает массив типов сообщений для резервного копирования. В этом есть один недостаток, хотя, если два типа сообщений имеют одинаковый слизень, а оба – /% postname% /, то он показывает оба.

 class MyCustomPostType { /** * Register post type **/ public static function register_post_type() { global $wp_rewrite; $args = array( 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => false, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','thumbnail') ); register_post_type('my_custom_post_type', $args); // Enables the pages to work simultaneously $wp_rewrite->use_verbose_page_rules = true; add_filter("rewrite_rules_array", array(__CLASS__, 'rewrite_rules_array')); add_action("parse_query", array(__CLASS__, 'parse_query')); add_filter("post_type_link", array(__CLASS__, 'post_type_link'), 1, 4); } public static function post_type_link($link, $post, $leavename=false, $sample=false) { if ($sample && ($begin = strpos($link, "?my_custom_post_type=")) !== false) { return substr($link, 0, $begin-1) . "/%my_custom_post_type%/"; } return str_replace("?my_custom_post_type=", "", $link) . "/"; } public static function parse_query($query) { global $wp, $wp_rewrite; // Is this query for /%post_name%/? Is it main request query? if (isset($query->query['name']) && substr($wp->matched_rule, 0, 7) == "([^/]+)" && isset($query->query) && isset($wp->query_vars) && $query->query == $wp->query_vars) { //echo '<p><h1>hit!</h1></p>'; if (!($post_types = get_query_var("post_type"))) { if ($wp_rewrite->permalink_structure == "/%postname%/") $post_types = array("post"); else $post_types = array(); } if (is_array($post_types)) $post_types[] = "my_custom_post_type"; set_query_var("post_type", $post_types); //set_query_var("posts_per_page", 1); } } public static function rewrite_rules_array($array) { global $wp_rewrite; // Same rules as in /%post_name%/ return array_merge($array, $wp_rewrite->generate_rewrite_rules("/%postname%/", EP_PERMALINK)); } } add_action('init', array("MyCustomPostType", "register_post_type")); 

Я создал решение, и я не смог найти проблему с ним. Пожалуйста, попробуйте сказать мне, если вы найдете проблему

 add_action('init', 'firmasite_resimlitarif_cpt', 0); function firmasite_resimlitarif_cpt() { // Yemek Tarifi $args = array( 'public' => true, 'show_in_menu' => true, 'permalink_epmask' => EP_NONE, 'rewrite' => array('slug'=>'/','with_front'=>false), 'has_archive' => false, 'supports' => array('title','editor','thumbnail') ); register_post_type('yemek',$args); } // http://wordpress.stackexchange.com/questions/37650/wordpress-3-3-custom-post-type-with-postname-permastruct add_action("parse_query", 'firmasite_resimlitarif_parse_query'); function firmasite_resimlitarif_parse_query($query) { global $wp, $wp_rewrite; // Is this query for /%post_name%/? Is it main request query? if (isset($query->query['name']) && substr($wp->matched_rule, 0, 7) == "([^/]+)" && isset($query->query) && isset($wp->query_vars) && $query->query == $wp->query_vars) { if (!($post_types = get_query_var("post_type"))) { if ($wp_rewrite->permalink_structure == "/%postname%/") $post_types = array("post"); else $post_types = array(); } if (is_array($post_types)){ $post_types[] = 'yemek'; $post_types[] = 'page'; } set_query_var("post_type", $post_types); } } 

Измените 'yemek' на ваше имя типа сообщения.

Эта ссылка должна ответить на ваш вопрос:

http://ottopress.com/2011/how-the-postname-permalinks-in-wordpress-3-3-work/

Самый чистый ответ, который я мог бы придумать для этого (я создаю плагин, который действительно нуждается в настраиваемом типе сообщений без какого-либо ведущего slug) заключается в использовании настраиваемого шаблона страницы вместо использования настраиваемого типа сообщений.

Делая это, ваш «пользовательский тип сообщения» может иметь URL-адреса, такие как / без необходимости беспокоиться о переходе на страницу или размещать постоянные ссылки.

Чтобы сделать это, я закончил:

  • Добавление настраиваемого шаблона страницы внутри моего плагина
  • Настройка шаблона страницы, чтобы его можно было выбрать в редакторе страниц
  • Создание настраиваемых мета-полей, которые отображаются только для моего шаблона страницы

Это позволило мне:

  • Выдвиньте список страниц, которые используют шаблон страницы, используя WP_Query

  • Добавьте специальную обработку, подключившись к add_meta_boxes, чтобы сохранить мои пользовательские данные

  • Добавьте мой настраиваемый шаблон к тем, которые отображаются при фильтрации страницы_attributes_dropdown_pages_args, theme_page_templates, wp_insert_post_data и template_include, см. Этот пост при добавлении шаблонов страниц в плагин

Нижние стороны

Конечно, хотя это не топает на страницах или сообщениях, у него есть несколько очевидных недостатков.

Нет архива. У вас не будет архива (если вы этого хотите), хотя это можно решить, создав еще один шаблон страницы, чтобы нарисовать архив всех страниц с помощью настраиваемого шаблона.

Управляется в разделе «Страницы». В администраторе вы не получаете хорошую навигацию слева, которая группирует все типы сообщений вместе.

Это можно частично решить, добавив фильтр в список страниц (чтобы вы могли фильтровать по используемому шаблону страницы), показывая любой шаблон страницы, используемый в новом столбце и т. Д.


При этом мне хотелось что-то, что не заставило бы пользователей задаваться вопросом, почему они создали новую настраиваемую страницу, и обнаружили, что они могут либо больше не доходить до обычных страниц, либо на новой пользовательской странице, из-за которой исчезла существующая страница на своем сайте.

Я знаю, что это не настоящее решение, но это альтернатива, которая отлично подойдет для моих нужд.