В WordPress, как переписать URL-адреса пользовательских типов записей, чтобы использовать красивую структуру постоянных ссылок - PullRequest
0 голосов
/ 30 октября 2019

У меня есть несколько пользовательских типов записей на сайте с URL-адресами, которые в настоящее время запрашивают идентификатор, и я пытаюсь переписать эти URL-адреса, чтобы использовать довольно постоянную структуру ссылок. Некоторые примеры почтовых URL:

пример 1:

текущий: https://accountability -framework.org / core-принципы /? Core_principle = 88
желательно: https://accountability -framework.org / core-принципы / 2-уважение к правам человека

пример 2:

текущий: https://accountability -framework.org / содержимое системы / free-before-and-информированный-согласия /? Guide_topic = 0
желательно: https://accountability -framework.org / «Содержание» / «Свободное предварительное и информированное согласие» / 1-fpic-Definition-and-Overview

Итак, желаемый формат URL:https://accountability -framework.org / name-of-post-type / name-of-post / name-of-theme-if-present

Как ни странно, при просмотре сообщения вWP admin, постоянная ссылка указана правильно:

enter image description here

, но содержимое всей страницы загружается неправильно.


Inнаш каталог post-types, он находится в principles.php (управляющий первым примером поста выше):

<?php

/**
 * Principles
 */

namespace App;

add_action( 'init', '\App\principles_post_type' );
function principles_post_type() {
    register_post_type(
        'principle',
        array(
            'labels' => array(
                  'name'               => __( 'Core Principles', TEXT_DOMAIN ),
                  'singular_name'      => __( 'Core Principle', TEXT_DOMAIN ),
                  'add_new'            => __( 'New Principle', TEXT_DOMAIN ),
                  'add_new_item'       => __( 'Add New Principle', TEXT_DOMAIN ),
                  'new_item'           => __( 'New Principle', TEXT_DOMAIN ),
                  'edit_item'          => __( 'Edit Principle', TEXT_DOMAIN ),
                  'view_item'          => __( 'View Principle', TEXT_DOMAIN ),
                  'all_items'          => __( 'All Principles', TEXT_DOMAIN ),
                  'search_items'       => __( 'Search Principles', TEXT_DOMAIN )
            ),
            'public' => true,
            'publicly_queryable'  => true,
            'exclude_from_search' => false,
            'has_archive' => true,
            'hierarchical' => false,
            'rewrite' => array( 'slug' => __( 'core-principles', TEXT_DOMAIN ), 'with_front' => false ),
            'show_in_menu' => true,
            'show_in_admin_bar' => true,
            'supports' => array( 'title', 'revisions' ),
            'menu_position' => 6,
            'menu_icon' => 'dashicons-thumbs-up'
        )
    );
}

, и это в guidance.php (goвторой пример сообщения выше):

<?php

/**
 * Guidances
 */

namespace App;

add_action('init', '\App\guidance_post_type');
function guidance_post_type() {
    register_post_type(
        'guidance',
        array(
            'labels' => array(
                  'name'               => __('Operational Guidance', TEXT_DOMAIN),
                  'singular_name'      => __('Operational Guidance', TEXT_DOMAIN),
                  'add_new'            => __('New Operational Guidance', TEXT_DOMAIN),
                  'add_new_item'       => __('Add New Operational Guidance', TEXT_DOMAIN),
                  'new_item'           => __('New Opertional Guidance', TEXT_DOMAIN),
                  'edit_item'          => __('Edit Operational Guidance', TEXT_DOMAIN),
                  'view_item'          => __('View Operational Guidance', TEXT_DOMAIN),
                  'all_items'          => __('All Operational Guidance', TEXT_DOMAIN),
                  'search_items'       => __('Search Operational Guidance', TEXT_DOMAIN)
            ),
            'public' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'has_archive' => true,
            'hierarchical' => false,
            'rewrite' => array('slug' => __('contents-of-the-framework', TEXT_DOMAIN ), 'with_front' => false),
            'show_in_menu' => true,
            'show_in_admin_bar' => true,
            'supports' => array('title', 'revisions'),
            'menu_position' => 5,
            'menu_icon' => 'dashicons-analytics'
        )
    );
}

Постоянные ссылки установлены на "Имя сообщения": https://accountability -framework.org / sample-post /

Что касается первого примера выше, я также попытался добавить правило перезаписи в principles.php:

function core_principle_rewrite_tag_rule() {
  add_rewrite_tag( '%core_principle%', '([^&]+)' );
  add_rewrite_rule( '^core_principles/([^/]*)/?', 'index.php?core_principle=$matches[1]','top' );
}
add_action('init', 'core_principle_rewrite_tag_rule', 10, 0);

Но без кубиков. Как настроить URL-адреса всех этих пользовательских типов записей в соответствии с нужным форматом?

Я использую WordPress версии 5.2.4 с темой для начинающих Sage: https://roots.io/sage/

Спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

На некоторых серверах, если ваши разрешения не установлены правильно, это может не сработать, и вам, возможно, придется обновить файл .htaccess вручную.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Важно: Если вы изменяете существующий файл .htaccess, сначала сделайте резервную копию файла на вашем компьютере, только если вы что-то испортили.

или

Правила перезаписи автоматического сброса

Другая причина появления 404 ошибок - всякий раз, когда регистрируется новый тип записи, вы должны «сбрасывать» свои правила перезаписи в WordPress. Это можно сделать, перейдя в «Настройки»> «Постоянные ссылки» и нажав кнопку «Сохранить» (упомянуто в первом разделе этого сообщения).

Если вы работаете над пользовательской темой или плагином с зарегистрированными типами сообщений, вы можете захотетьРассмотрите возможность автоматического сброса правил перезаписи для вашего конечного пользователя, когда они активируют вашу тему или плагин, чтобы предотвратить любые ошибки 404. Ниже приведен пример кода, который вы можете использовать:

// Code for themes
add_action( 'after_switch_theme', 'flush_rewrite_rules' );

// Code for plugins
register_deactivation_hook( __FILE__, 'flush_rewrite_rules' );
register_activation_hook( __FILE__, 'myplugin_flush_rewrites' );
function myplugin_flush_rewrites() {
    // call your CPT registration function here (it should also be hooked into 'init')
    myplugin_custom_post_types_registration();
    flush_rewrite_rules();
}
...