Intereting Posts
Mobilepress не может переводить короткие коды Альтернатива настраиваемым полям для больших данных? Если (категория / тег отмечен), то (display header2php) Включение SSL в wordpress приводит к 404 как сохранить выбранную опцию в переменной для атрибута категории отдыха api Как добавить средства массовой информации из внешнего интерфейса в существующий пост? Есть ли способ переименовать или скрыть wp-login.php? Категоризация только импортированных сообщений Плагин для WordPress Как добавить оператор php в строку jQuery Каков правильный путь для многодоменного и многоязычного веб-сайта? Почему две функции перебегают друг к другу? Каков наилучший способ предотвратить доступ к пользовательским типам сообщений, если они не аутентифицированы, когда тип сообщения имеет архив и является общедоступным? Как создать собственный код для пользовательской формы входа? WordPress slug добавляет подкатегорию в URL-адрес сообщения

Тип пользовательского сообщения 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, см. Этот пост при добавлении шаблонов страниц в плагин

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

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

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

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

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


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

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