Adăugare setări pentru tipuri personalizate de postare în WordPress

5 aug. 2016, 12:10:18
Vizualizări: 15.3K
Voturi: 3

Am un tip personalizat de postare numit Portfolio. Acesta este asociat cu trei taxonomii personalizate. Toate funcționează corect.

Pentru pagina de arhivă, totuși, trebuie să adaug câteva setări personalizate. Din cauza unei limitări în proiect, nu pot scrie un plugin - toate modificările trebuie făcute în tema.

Am reușit să fac să apară submeniul pentru setări (destul de ușor) urmând acest ghid, iar setările apar pe pagină fără probleme. Problema acum este că acestea nu se salvează.

Am adăugat doar o singură setare (header_text) până voi rezolva problema cu salvarea.

Cred că $option_group este probabil problema.

Dacă fac var_dump($_POST) obțin:

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)

Iată înregistrarea tipului personalizat de postare:

if ( ! function_exists('rushhour_post_type_projects') ) :

// Adaugă proiecte Portfolio în WordPress
add_action( 'init', 'rushhour_post_type_projects', 0 );

// Înregistrează tipul personalizat de postare pentru proiecte Portfolio
function rushhour_post_type_projects()
{
    $labels = array(
        'name'                  => _x( 'Portfolio', 'Numele general al tipului de postare', 'rushhour' ),
        'singular_name'         => _x( 'Proiect', 'Numele singular al tipului de postare', 'rushhour' ),
        'menu_name'             => __( 'Proiecte Portfolio', 'rushhour' ),
        'name_admin_bar'        => __( 'Proiect Portfolio', 'rushhour' ),
        'archives'              => __( 'Arhive Portfolio', 'rushhour' ),
        'parent_item_colon'     => __( 'Proiect părinte:', 'rushhour' ),
        'all_items'             => __( 'Toate proiectele', 'rushhour' ),
        'add_new_item'          => __( 'Adaugă proiect nou', 'rushhour' ),
        'add_new'               => __( 'Adaugă nou', 'rushhour' ),
        'new_item'              => __( 'Proiect nou', 'rushhour' ),
        'edit_item'             => __( 'Editează proiect', 'rushhour' ),
        'update_item'           => __( 'Actualizează proiect', 'rushhour' ),
        'view_item'             => __( 'Vezi proiect', 'rushhour' ),
        'search_items'          => __( 'Caută proiecte', 'rushhour' ),
        'not_found'             => __( 'Nu a fost găsit', 'rushhour' ),
        'not_found_in_trash'    => __( 'Nu a fost găsit în gunoi', 'rushhour' ),
        'featured_image'        => __( 'Imagine reprezentativă', 'rushhour' ),
        'set_featured_image'    => __( 'Setează imagine reprezentativă', 'rushhour' ),
        'remove_featured_image' => __( 'Șterge imagine reprezentativă', 'rushhour' ),
        'use_featured_image'    => __( 'Folosește ca imagine reprezentativă', 'rushhour' ),
        'insert_into_item'      => __( 'Inserează în proiect', 'rushhour' ),
        'uploaded_to_this_item' => __( 'Încărcat la acest proiect', 'rushhour' ),
        'items_list'            => __( 'Listă proiecte', 'rushhour' ),
        'items_list_navigation' => __( 'Navigare listă proiecte', 'rushhour' ),
        'filter_items_list'     => __( 'Filtrează lista de proiecte', 'rushhour' ),
        );
    $rewrite = array(
        'slug'                  => 'portfolio',
        'with_front'            => true,
        'pages'                 => true,
        'feeds'                 => true,
        );
    $args = array(
        'label'                 => __( 'Proiect', 'rushhour' ),
        'description'           => __( 'Proiecte portfolio pentru 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;

Apoi am o funcție pentru configurarea paginii de submeniu din admin.

if ( ! function_exists('rushhour_projects_admin_page') ) :

add_action( 'admin_menu' , 'rushhour_projects_admin_page' );

/**
 * Generează pagina de submeniu pentru setări
 *
 * @uses rushhour_projects_options_display()
 */
function rushhour_projects_admin_page()
{
    add_submenu_page(
        'edit.php?post_type=rushhour_projects',
        __('Opțiuni proiecte Portfolio', 'rushhour'),
        __('Opțiuni Portfolio', 'rushhour'),
        'manage_options',
        'projects_archive',
        'rushhour_projects_options_display');
}
endif;

Cele două elemente de mai sus funcționează fără probleme.

Problema, cred, este undeva în funcțiile de mai jos pentru înregistrarea și salvarea setărilor:

if ( ! function_exists('rushhour_projects_options_display') ) :
/**
 * Afișează formularul pe submeniul de setări Rush Hour Projects.
 *
 * Folosit de 'rushhour_projects_admin_page'.
 */
function rushhour_projects_options_display()
{
    // Creează un antet în containerul 'wrap' implicit WordPress
    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' );

/**
 * Înregistrează setări și adaugă secțiuni și câmpuri la pagina de admin.
 */
function rushhour_projects_settings()
{
    if ( false == get_option( 'rushhour_projects_archive' ) )
        add_option( 'rushhour_projects_archive' );

    add_settings_section(
        'projects_archive_header', // ID secțiune
        __('Setări pagină de arhivă proiecte Portfolio', 'rushhour'),
        'rushhour_project_settings_section_title', // Callback
        'edit.php?post_type=rushhour_projects&page=projects_archive' // Slug pagină setări
        );

    add_settings_field(
        'header_text',          // ID câmp
        __('Text antet', 'rushhour'),          // Titlu setare
        'projects_archive_header_text_callback',
        'edit.php?post_type=rushhour_projects&page=projects_archive',   // Slug pagină setări
        'projects_archive_header',          // ID secțiune
        array('Text de afișat în antetul arhivei.')
        );

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

/**
 * Callback pentru secțiunea de setări.
 *
 * Comentat până când setările vor funcționa.
 * 
 * @param  array $args Primește $id, $title și $callback.
 */
function rushhour_project_settings_section_title( $args ) {
    // printf( '<h2>%s</h2>', apply_filters( 'the_title', $args['title'] ) );
}

/**
 * Callback-uri pentru câmpurile de setări.
 */
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 );
}

/**
 * Salvează opțiunile.
 */
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]'] );
    }
}
3
Comentarii

Doar pentru a comenta pe subiectul "Nu pot scrie un plugin", asta nu este o problemă. De obicei, orice ai pune într-un plugin poate fi introdus în fișierul functions.php al temei, dacă se potrivește mai bine situației tale.

Andy Macaulay-Brook Andy Macaulay-Brook
5 aug. 2016 12:12:50

Bună, Andy. Mulțumesc pentru răspuns. Ai dreptate, nu este o problemă, dar am considerat că este un parametru demn de menționat pentru cei care răspund.

dotZak dotZak
5 aug. 2016 12:14:25

Da. Întrebare foarte completă și detaliată. Nu pot răspunde eu în momentul de față, dar sper că votul meu pozitiv îți va atrage atenția cuiva.

Andy Macaulay-Brook Andy Macaulay-Brook
5 aug. 2016 12:22:23
Toate răspunsurile la întrebare 2
0

Bine, așa că m-am enervat că nu funcționa și am decis să o rescriu pur și simplu. Nu sunt sigur care a fost soluția, dar bănuiesc două lucruri: punctul final greșit pentru formular (ar trebui să fie options.php) și $option_group și $option_name greșite (probabil nu au fost potrivite corect).

Pentru posteritate, voi lăsi aici rescrierea mea și sper că va ajuta și pe alții. Câteva diferențe între această versiune și cea anterioară.

  1. Aceasta este acum în propriul fișier, așa că nu veți vedea tipul de postare personalizat înregistrat.
  2. Am folosit un obiect pentru pagină conform exemplului 2 din codex-ul WordPress.
  3. Am adăugat o a doua opțiune pentru un încărcător media folosind acest tutorial, pe care l-am actualizat să folosească wp_localize_script() pentru a injecta un obiect JSON pentru a obține niște date PHP.
    <?php
    class RushHourProjectArchivesAdminPage
    {
        /**
         * Reține valorile care vor fi utilizate în apelurile câmpurilor
         */
        private $options;

        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' ) );
        }

        /**
         * Adaugă o pagină de submeniu la tipul de postare personalizat
         */
        public function add_submenu_page_to_post_type()
        {
            add_submenu_page(
                'edit.php?post_type=rushhour_projects',
                __('Opțiuni Proiecte Portofoliu', 'rushhour'),
                __('Opțiuni Portofoliu', 'rushhour'),
                'manage_options',
                'projects_archive',
                array($this, 'rushhour_projects_options_display'));
        }

        /**
         * Callback pentru pagina de opțiuni
         */
        public function rushhour_projects_options_display()
        {
            $this->options = get_option( 'rushhour_projects_archive' );

            wp_enqueue_media();

            echo '<div class="wrap">';

            printf( '<h1>%s</h1>', __('Opțiuni Portofoliu', 'rushhour' ) ); 

            echo '<form method="post" action="options.php">';

            settings_fields( 'projects_archive' );

            do_settings_sections( 'projects-archive-page' );

            submit_button();

            echo '</form></div>';
        }

        /**
         * Înregistrează și adaugă setări
         */
        public function sub_menu_page_init()
        {
            register_setting(
                'projects_archive', // Grup de opțiuni
                'rushhour_projects_archive', // Nume opțiune
                array( $this, 'sanitize' ) // Sanitizare
                );

            add_settings_section(
                'header_settings_section', // ID
                __('Setări Antet', 'rushhour'), // Titlu
                array( $this, 'print_section_info' ), // Callback
                'projects-archive-page' // Pagină
                );

            add_settings_field(
                'archive_description', // ID
                __('Descriere Arhivă', 'rushhour'), // Titlu
                array( $this, 'archive_description_callback' ), // Callback
                'projects-archive-page', // Pagină
                'header_settings_section' // Secțiune
                );

            add_settings_field(
                'image_attachment_id',
                __('Imagine Fundal Antet', 'rushhour'),
                array( $this, 'header_bg_image_callback' ),
                'projects-archive-page',
                'header_settings_section'
                );
        }

        /**
         * Sanitizează fiecare câmp de setare conform necesităților
         *
         * @param array $input Conține toate câmpurile de setare ca chei de array
         */
        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;
        }

        /**
         * Afișează textul Secțiunii
         */
        public function print_section_info()
        {
            print 'Selectați opțiuni pentru antetul paginii de arhivă.';
        }

        /**
         * Obține array-ul de opțiuni de setare și afișează una dintre valorile sale
         */
        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']) : ''
                );
        }

        /**
         * Obține array-ul de opțiuni de setare și afișează una dintre valorile sale
         */
        public function header_bg_image_callback()
        {
            $attachment_id = $this->options['image_attachment_id'];

            // Previzualizare Imagine
            printf('<div class="image-preview-wrapper"><img id="image-preview" src="%s" alt="Previzualizare imagine fundal" title="Previzualizare imagine fundal"></div>', wp_get_attachment_url( $attachment_id ) );

            // Buton Încărcare Imagine
            printf( '<input id="upload_image_button" type="button" class="button" value="%s" />',
                __( 'Încarcă imagine', 'rushhour' ) );

            // Câmp ascuns care conține valoarea ID-ului atașamentului imaginii
            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' );
        }
    }

Apoi apelați pur și simplu obiectul dacă is_admin() este adevărat:

    if ( is_admin() )
         $my_settings_page = new RushHourProjectArchivesAdminPage();
8 aug. 2016 12:04:47
2

Acest lucru ar trebui să funcționeze. Schimbă

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]'] );
    }
}

în

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'] );
    }
}
5 aug. 2016 13:23:10
Comentarii

Oh. Desigur! Voi încerca și vă voi anunța cum merge. Mulțumesc pentru asta.

dotZak dotZak
6 aug. 2016 03:15:22

Aceasta nu a rezolvat problema. Tocmai s-a terminat weekendul aici, așa că voi putea să mă uit peste ea în dimineața asta și vă voi anunța dacă voi folosi o versiune rafinată a răspunsului dumneavoastră sau nu.

dotZak dotZak
8 aug. 2016 04:18:02