schreibe den benutzerdefinierten post type slug in wp admin neu

Ich entwickle eine Website, die eventuell eine Kopie hat, eine separate WP-Installation in einer anderen Sprache. Ich habe ein paar benutzerdefinierte Post-Typen auf dieser Seite, einige von ihnen mit benutzerdefinierten Slugs für Archiv-Seite und / oder für einzelne Beiträge. Ich frage mich, ob ich Optionen von einer benutzerdefinierten Admin-Seite verwenden könnte, um dies zu tun? Hat dieser Ansatz irgendwelche Fallstricke?

Also würde ich eine benutzerdefinierte Option definieren, die in WP Admin verwendet wird:

class MySettingsPage { private $options; public function __construct() { add_action( 'admin_menu', array( $this, 'add_plugin_page' ) ); add_action( 'admin_init', array( $this, 'page_init' ) ); } public function add_plugin_page() { // This page will be under "Settings" add_options_page( 'Settings Admin', 'Custom Settings', 'manage_options', 'my-setting-admin', array( $this, 'create_admin_page' ) ); } public function create_admin_page() { // Set class property $this->options = get_option( 'my_option_name' ); ?> 

Custom Settings

<?php } public function page_init() { register_setting( 'my_option_group', // Option group 'my_option_name', // Option name array( $this, 'sanitize' ) // Sanitize ); add_settings_section( 'setting_section_id', // ID 'My Custom Settings', // Title array( $this, 'print_section_info' ), // Callback 'my-setting-admin' // Page ); add_settings_field( 'custom_slug', // slug 'Custom Slug', // Title array( $this, 'custom_slug_callback' ), // Callback 'my-setting-admin', // Page 'setting_section_id' // Section ); } public function sanitize( $input ) { $new_input = array(); if( isset( $input['custom_slug'] ) ) $new_input['custom_slug'] = sanitize_text_field( $input['custom_slug'] ); return $new_input; } public function print_section_info() { print 'Enter your settings below:'; } public function custom_slug_callback() { printf( '', isset( $this->options['custom_slug'] ) ? esc_attr( $this->options['custom_slug']) : '' ); } } if( is_admin() ) { $my_settings_page = new MySettingsPage(); }

Versuchen Sie dann, den Wert der Option als Slug zum Registrieren von Post-Typen zu verwenden:

 $o = get_option('my_option_name'); $s = $o['custom_slug']; register_post_type( 'ugly_machine_name', array( 'labels' => array( 'name' => __( 'Pretty Name', 'my-child-theme' ), 'singular_name' => __( 'Pretty Name', 'my-child-theme' ) ), 'public' => true, 'has_archive' => $s, 'rewrite' => array( 'slug' => $s, 'with_front' => false ), 'supports' => array( 'title', 'editor', 'custom-fields' ) ) ); 

Mir ist bewusst, dass nach jeder Änderung dieser Optionen die Permalinks-Option geladen werden muss, damit die Einstellungen wirksam werden, aber sie wird nur einmal geändert, wenn die Site kopiert wird.

Ich habe das vorher schon mal für ähnliche Zwecke auf einer anderen Seite versucht, und es hat nicht funktioniert:

 register_post_type( 'ugly_machine_name', array( 'labels' => array( 'name' => __( 'Pretty Name', 'my-child-theme' ), // these got 'singular_name' => __( 'Pretty Name', 'my-child-theme' ) // loaded ), 'public' => true, 'has_archive' => __( 'pretty-name', 'my-child-theme' ), // theese didn't load (the translations) 'rewrite' => array( 'slug' => __( 'pretty-name', 'my-child-theme' ), 'with_front' => false ), 'supports' => array( 'title', 'editor', 'custom-fields' ) ) ); 

Solutions Collecting From Web of "schreibe den benutzerdefinierten post type slug in wp admin neu"

Also was ich getan habe, war:

Erstellen Sie zuerst eine function, die diese Slugs basierend auf dem Namen des benutzerdefinierten Posttyps zurückgibt, und wenn der angegebene benutzerdefinierte Slug die Anforderungen nicht erfüllt, fällt er auf einen Standardwert zurück:

 function my_get_custom_slugs($cpt){ $all_the_slugs = [ "ugly_machine_name_1" => "default-pretty-name-1", "ugly_machine_name_2" => "default-pretty-name-2", //...etc ]; $r_val = array(); $options = get_option('my_option_name'); foreach ($all_the_slugs as $key => $val) { if (strlen(trim($options[$key . "_slug"])) > 2){ $r_val[$key] = $options[$key . "_slug"]; } else { $r_val[$key] = $val; } } return $r_val[$cpt]; } 

Natürlich muss ich jetzt die IDs der Felder für benutzerdefinierte Optionen umbenennen, damit sie mit dem benutzerdefinierten Post-Typ-Namen + “_slug” übereinstimmen.

Und jetzt kann ich es in meinen Registriertypen verwenden:

 register_post_type( 'this_cpt', array( 'labels' => array( 'name' => __( 'This CPT Name', 'my-child-theme' ), 'singular_name' => __( 'This CPT Name', 'my-child-theme' ) ), 'public' => true, 'has_archive' => my_get_custom_slugs('this_cpt'), 'rewrite' => array( 'slug' => my_get_custom_slugs('this_cpt'), 'with_front' => false ), 'supports' => array( 'title', 'editor', 'custom-fields' ) ) ); 

Und auch irgendwo in meinen Template-Dateien, wenn ich muss.