webentwicklung-frage-antwort-db.com.de

Einstellungen zum benutzerdefinierten Beitragstyp hinzufügen

Ich habe einen benutzerdefinierten Beitragstyp namens Portfolio. Es ist mit drei benutzerdefinierten Taxonomien verknüpft. Das funktioniert alles gut.

Für die Archivseite muss ich jedoch einige benutzerdefinierte Einstellungen hinzufügen. Aufgrund einer Einschränkung im Projekt kann ich kein Plugin schreiben - alle Änderungen müssen im Theme vorgenommen werden.

Nach dieser Anleitung wird die Seite mit dem Untermenü "Einstellungen" angezeigt (einfach genug), und die Einstellungen werden ohne Probleme auf der Seite angezeigt. Das Problem ist jetzt, dass sie nicht speichern.

Ich habe nur eine Einstellung (header_text) hinzugefügt, bis ich das Speicherproblem herausfinden kann.

Ich stelle mir vor, dass $option_group wahrscheinlich das Problem ist.

Wenn ich var_dump($_POST) bekomme:

array (size=6)
  'option_page' => string 'edit.php?post_type=rushhour_projects&page=projects_archive' (length=58)
  'action' => string 'update' (length=6)
  '_wpnonce' => string '23c70a3029' (length=10)
  '_wp_http_referer' => string '/wp-admin/edit.php?post_type=rushhour_projects&page=projects_archive' (length=68)
  'rushhour_projects_archive' => 
    array (size=1)
      'header_text' => string 'asdf' (length=4)
  'submit' => string 'Save Changes' (length=12)

Hier ist die benutzerdefinierte Posttyp-Registrierung:

if ( ! function_exists('rushhour_post_type_projects') ) :

// Add Portfolio Projects to WordPress
add_action( 'init', 'rushhour_post_type_projects', 0 );

// Register Portfolio Projects Custom Post Type
function rushhour_post_type_projects()
{
    $labels = array(
        'name'                  => _x( 'Portfolio', 'Post Type General Name', 'rushhour' ),
        'singular_name'         => _x( 'Project', 'Post Type Singular Name', 'rushhour' ),
        'menu_name'             => __( 'Portfolio Projects', 'rushhour' ),
        'name_admin_bar'        => __( 'Portfolio Project', 'rushhour' ),
        'archives'              => __( 'Portfolio Archives', 'rushhour' ),
        'parent_item_colon'     => __( 'Parent Project:', 'rushhour' ),
        'all_items'             => __( 'All Projects', 'rushhour' ),
        'add_new_item'          => __( 'Add New Project', 'rushhour' ),
        'add_new'               => __( 'Add New', 'rushhour' ),
        'new_item'              => __( 'New Project', 'rushhour' ),
        'edit_item'             => __( 'Edit Project', 'rushhour' ),
        'update_item'           => __( 'Update Project', 'rushhour' ),
        'view_item'             => __( 'View Project', 'rushhour' ),
        'search_items'          => __( 'Search Projects', 'rushhour' ),
        'not_found'             => __( 'Not found', 'rushhour' ),
        'not_found_in_trash'    => __( 'Not found in Trash', 'rushhour' ),
        'featured_image'        => __( 'Featured Image', 'rushhour' ),
        'set_featured_image'    => __( 'Set featured image', 'rushhour' ),
        'remove_featured_image' => __( 'Remove featured image', 'rushhour' ),
        'use_featured_image'    => __( 'Use as featured image', 'rushhour' ),
        'insert_into_item'      => __( 'Insert into project', 'rushhour' ),
        'uploaded_to_this_item' => __( 'Uploaded to this project', 'rushhour' ),
        'items_list'            => __( 'Projects list', 'rushhour' ),
        'items_list_navigation' => __( 'Projects list navigation', 'rushhour' ),
        'filter_items_list'     => __( 'Filter projects list', 'rushhour' ),
        );
    $rewrite = array(
        'slug'                  => 'portfolio',
        'with_front'            => true,
        'pages'                 => true,
        'feeds'                 => true,
        );
    $args = array(
        'label'                 => __( 'Project', 'rushhour' ),
        'description'           => __( 'Portfolio projects for Global VDC.', 'rushhour' ),
        'labels'                => $labels,
        'supports'              => array( 'title', 'editor', 'excerpt', 'thumbnail', 'revisions', ),
        'taxonomies'            => array( 'rushhour_clients', 'rushhour_locations', 'rushhour_project_type' ),
        'hierarchical'          => false,
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5,
        'menu_icon'             => 'dashicons-portfolio',
        'show_in_admin_bar'     => true,
        'show_in_nav_menus'     => true,
        'can_export'            => true,
        'has_archive'           => 'portfolio',
        'exclude_from_search'   => false,
        'publicly_queryable'    => true,
        'rewrite'               => $rewrite,
        'capability_type'       => 'page',
        );
    register_post_type( 'rushhour_projects', $args );
}
endif;

Dann habe ich eine Funktion zum Einrichten der Admin-Untermenüseite.

if ( ! function_exists('rushhour_projects_admin_page') ) :

add_action( 'admin_menu' , 'rushhour_projects_admin_page' );

/**
 * Generate sub menu page for settings
 *
 * @uses rushhour_projects_options_display()
 */
function rushhour_projects_admin_page()
{
    add_submenu_page(
        'edit.php?post_type=rushhour_projects',
        __('Portfolio Projects Options', 'rushhour'),
        __('Portfolio Options', 'rushhour'),
        'manage_options',
        'projects_archive',
        'rushhour_projects_options_display');
}
endif;

Die beiden oben genannten Punkte funktionieren also ohne Probleme.

Ich denke, das Problem liegt irgendwo in den folgenden Funktionen zum Registrieren und Speichern der Einstellungen:

if ( ! function_exists('rushhour_projects_options_display') ) :
/**
 * Display the form on the Rush Hour Projects Settings sub menu page.
 *
 * Used by 'rushhour_projects_admin_page'.
 */
function rushhour_projects_options_display()
{
    // Create a header in the default WordPress 'wrap' container
    echo '<div class="wrap">';

    settings_errors();

    echo '<form method="post" action="">';

    var_dump( get_option('rushhour_projects_archive') );

    settings_fields( 'edit.php?post_type=rushhour_projects&page=projects_archive' );

    do_settings_sections( 'edit.php?post_type=rushhour_projects&page=projects_archive' );

    submit_button();

    echo '</form></div><!-- .wrap -->';
}
endif;

add_action( 'admin_init', 'rushhour_projects_settings' );

/**
 * Register settings and add settings sections and fields to the admin page.
 */
function rushhour_projects_settings()
{
    if ( false == get_option( 'rushhour_projects_archive' ) )
        add_option( 'rushhour_projects_archive' );

    add_settings_section(
        'projects_archive_header', // Section $id
        __('Portfolio Project Archive Page Settings', 'rushhour'),
        'rushhour_project_settings_section_title', // Callback
        'edit.php?post_type=rushhour_projects&page=projects_archive' // Settings Page Slug
        );

    add_settings_field(
        'header_text',          // Field $id
        __('Header Text', 'rushhour'),          // Setting $title
        'projects_archive_header_text_callback',
        'edit.php?post_type=rushhour_projects&page=projects_archive',   // Settings Page Slug
        'projects_archive_header',          // Section $id
        array('Text to display in the archive header.')
        );

    register_setting(
        'edit.php?post_type=rushhour_projects&page=projects_archive', // $option_group
        'rushhour_projects_archive',  // $option_name
        'rushhour_projects_archive_save_options'
        );
}

/**
 * Callback for settings section.
 *
 * Commented out until settings are working.
 * 
 * @param  array $args Gets the $id, $title and $callback.
 */
function rushhour_project_settings_section_title( $args ) {
    // printf( '<h2>%s</h2>', apply_filters( 'the_title', $args['title'] ) );
}

/**
 * Settings fields callbacks.
 */
function projects_archive_header_text_callback($args)
{
    $options = get_option('rushhour_projects_archive');

    printf( '<input class="widefat" id="header_text" name="rushhour_projects_archive[header_text]" type="textarea" value="%1$s" />',
        $options );
}

/**
 * Save options.
 */
function rushhour_projects_archive_save_options()
{
    if ( isset( $_POST['rushhour_projects_archive[header_text]'] ) )
    {
        update_option( 'rushhour_projects_archive', $_POST['rushhour_projects_archive[header_text]'] );
    }
}
2
dotZak

Ok, also habe ich mich darüber geärgert, dass es nicht funktioniert und habe beschlossen, es einfach umzuschreiben. Ich bin mir sicher nicht sicher, was die Lösung war, aber ich vermute zwei Dinge: Der falsche Endpunkt für das Formular (sollte options.php sein) und der falsche $option_group und $option_name (das waren sie) wahrscheinlich nicht richtig zugeordnet).

Für die Nachwelt lasse ich mein Rewrite hier und hoffe, es hilft anderen. Einige Unterschiede zur Vorgängerversion.

  1. Dies befindet sich jetzt in einer eigenen Datei, sodass der benutzerdefinierte Beitragstyp nicht registriert wird.
  2. Ich habe ein Objekt für die Seite per Beispiel 2 aus dem WordPress-Codex verwendet.
  3. Ich habe mit diesem Tutorial eine zweite Option für einen Medien-Uploader hinzugefügt, die ich aktualisiert habe, um wp_localize_script() zum Einfügen eines JSON-Objekts zum Abrufen einiger PHP -Daten zu verwenden.

    public function __construct()
    {
        add_action( 'admin_menu', array( $this, 'add_submenu_page_to_post_type' ) );
        add_action( 'admin_init', array( $this, 'sub_menu_page_init' ) );
        add_action( 'admin_init', array( $this, 'media_selector_scripts' ) );
    }
    
    /**
     * Add sub menu page to the custom post type
     */
    public function add_submenu_page_to_post_type()
    {
        add_submenu_page(
            'edit.php?post_type=rushhour_projects',
            __('Portfolio Projects Options', 'rushhour'),
            __('Portfolio Options', 'rushhour'),
            'manage_options',
            'projects_archive',
            array($this, 'rushhour_projects_options_display'));
    }
    
    /**
     * Options page callback
     */
    public function rushhour_projects_options_display()
    {
        $this->options = get_option( 'rushhour_projects_archive' );
    
        wp_enqueue_media();
    
        echo '<div class="wrap">';
    
        printf( '<h1>%s</h1>', __('Portfolio Options', 'rushhour' ) ); 
    
        echo '<form method="post" action="options.php">';
    
        settings_fields( 'projects_archive' );
    
        do_settings_sections( 'projects-archive-page' );
    
        submit_button();
    
        echo '</form></div>';
    }
    
    /**
     * Register and add settings
     */
    public function sub_menu_page_init()
    {
        register_setting(
            'projects_archive', // Option group
            'rushhour_projects_archive', // Option name
            array( $this, 'sanitize' ) // Sanitize
            );
    
        add_settings_section(
            'header_settings_section', // ID
            __('Header Settings', 'rushhour'), // Title
            array( $this, 'print_section_info' ), // Callback
            'projects-archive-page' // Page
            );
    
        add_settings_field(
            'archive_description', // ID
            __('Archive Description', 'rushhour'), // Title
            array( $this, 'archive_description_callback' ), // Callback
            'projects-archive-page', // Page
            'header_settings_section' // Section
            );
    
        add_settings_field(
            'image_attachment_id',
            __('Header Background Image', 'rushhour'),
            array( $this, 'header_bg_image_callback' ),
            'projects-archive-page',
            'header_settings_section'
            );
    }
    
    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function sanitize( $input )
    {
        $new_input = array();
    
        if( isset( $input['archive_description'] ) )
            $new_input['archive_description'] = sanitize_text_field( $input['archive_description'] );
    
        if( isset( $input['image_attachment_id'] ) )
            $new_input['image_attachment_id'] = absint( $input['image_attachment_id'] );
    
        return $new_input;
    }
    
    /**
     * Print the Section text
     */
    public function print_section_info()
    {
        print 'Select options for the archive page header.';
    }
    
    /**
     * Get the settings option array and print one of its values
     */
    public function archive_description_callback()
    {
        printf(
            '<input type="text" id="archive_description" name="rushhour_projects_archive[archive_description]" value="%s" />',
            isset( $this->options['archive_description'] ) ? esc_attr( $this->options['archive_description']) : ''
            );
    }
    
    /**
     * Get the settings option array and print one of its values
     */
    public function header_bg_image_callback()
    {
        $attachment_id = $this->options['image_attachment_id'];
    
        // Image Preview
        printf('<div class="image-preview-wrapper"><img id="image-preview" src="%s" ></div>', wp_get_attachment_url( $attachment_id ) );
    
        // Image Upload Button
        printf( '<input id="upload_image_button" type="button" class="button" value="%s" />',
            __( 'Upload image', 'rushhour' ) );
    
        // Hidden field containing the value of the image attachment id
        printf( '<input type="hidden" name="rushhour_projects_archive[image_attachment_id]" id="image_attachment_id" value="%s">',
            $attachment_id );
    }
    
    public function media_selector_scripts()
    {
        $my_saved_attachment_post_id = get_option( 'media_selector_attachment_id', 0 );
    
        wp_register_script( 'sub_menu_media_selector_scripts', get_template_directory_uri() . '/admin/js/media-selector.js', array('jquery'), false, true );
    
        $selector_data = array(
            'attachment_id' => get_option( 'media_selector_attachment_id', 0 )
            );
    
        wp_localize_script( 'sub_menu_media_selector_scripts', 'selector_data', $selector_data );
    
        wp_enqueue_script( 'sub_menu_media_selector_scripts' );
    }
    

    }

Rufen Sie dann einfach das Objekt auf, wenn is_admin() wahr ist:

if ( is_admin() )
     $my_settings_page = new RushHourProjectArchivesAdminPage();
2
dotZak

Dies sollte den Trick machen. Veränderung

function rushhour_projects_archive_save_options()
{
    if ( isset( $_POST['rushhour_projects_archive[header_text]'] ) )
    {
        update_option( 'rushhour_projects_archive', $_POST['rushhour_projects_archive[header_text]'] );
    }
}

zu

function rushhour_projects_archive_save_options()
{
    if ( isset( $_POST['rushhour_projects_archive']['header_text'] ) )
    {
        update_option( 'rushhour_projects_archive', $_POST['rushhour_projects_archive']['header_text'] );
    }
}
0