Повторно визначити / змінити службовий вміст спеціального типу публікації плагіна


28

Чи можна передекларувати / змінити кулю існуючого спеціального типу публікації плагіна (без просто редагування плагіна)?

Тобто, якщо Plugin X створює користувальницький тип публікації за допомогою slug / uncookedtoast /, чи можна додати фільтр до function.php (або чогось подібного), який змінює слугу на / хліб /?


Я щойно вирішив цю проблему, підключившись до init з пріоритетом 20, а потім знову зателефонував до register_post_type для того ж типу публікації. Хтось знає, чи це спричинить мені якісь проблеми в дорозі?
Дастін

Відповіді:


24

Так, це можливо, але якщо плагін створює спеціальний тип публікації за допомогою rewrite => array('slug' => 'post_type')параметра, то ймовірно, що ви зможете замінити слизу.

Щоразу, коли створені спеціальні типи публікацій, правила перезапису URL-адрес записуються в базу даних. Залежно від того, яка дія запускає створення користувальницького типу публікації (наприклад, дії init ), WordPress очищатиме правила перезапису та відновлює ковзання користувальницького типу публікації незалежно від змін, які ви намагаєтесь внести.

Однак, ви можете надати користувацькі плаги для спеціальних типів публікацій. Наступний приклад передбачає, що у вас є власний тип публікації moviesта ви намагаєтесь змінити /movies/слизу на /films/.

Щоб завершити, ось основна функція, яка використовується для визначення moviesтипу користувальницької публікації. Плагін, на який ви посилаєтесь, повинен робити щось подібне:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Ви можете змінити таблицю параметрів, надавши власні власні правила на основі існуючого типу публікації.

В основному, ми це зробимо:

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

Ось як це можна зробити:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Тепер у вас є два способи отримати доступ до своїх фільмів:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Зауважте, що я не рекомендую вступати add_custom_rewrite_ruleв initдію, оскільки це буде надто часто стріляти. Це лише приклад. Кращим місцем для застосування функції буде активація теми, активація плагіну, можливо, дія save_post тощо. Залежно від того, що вам потрібно зробити, вам може знадобитися запустити її лише один раз або лише кілька разів.

На цьому етапі ви можете розглянути питання про оновлення постійних посилань для користувацького типу публікації для використання " /movies/слизи". Наприклад, якщо ви перейдете на сторінку /films/, ви побачите список усіх ваших фільмів, але наведення курсору на назву дозволить виявити, що /movies/слизька все ще використовується.

Щоб піти на крок далі, ви можете технічно встановити переспрямування 301, щоб зафіксувати всі посилання /movies/на переадресацію до їх /films/колеги, але все це залежить від того, що ви намагаєтеся зробити.


Працювали красиво! Чи можете ви також вказати мені в правильному напрямку для оновлення постійних посилань?
Едбері

1
Залежно від теми ви можете це зробити на рівні шаблону. Коли ви бачите виклик "the_title ()", ви можете замінити його на $ title = get_the_title (), а потім замінити рядок '/ movies /' у $ title на '/ films /'.
Том

Що робити, якщо слуп, який ви хочете змінити, динамічно створюється мета-значенням поточної публікації? Мені потрібно мати можливість використовувати $postцю add_custom_rewrite_rule()функцію, але це викидання помилок у WP Admin: "Спроба отримати властивість не-об'єкта". Як я можу отримати $ post, щоб отримати мета-значення?
Лі

6

Цей код добре працював на мою дитину. Потрібно змінити "програму" слизу на "місце".

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

Це прекрасно працює, я також використовував його для тегів, додаючи відносне правило, необхідно оновити постійні посилання, виконавши збереження на сторінці налаштувань> постійна посилання. Дякую!
Лоренцо Магон

Відмінно працює і для зміни інших аргументів, мені потрібно було встановити, $args['has_archive'] = falseі це спрацювало.
Просто розвиток
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.