Adăugare setări pentru tipuri personalizate de postare în WordPress
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]'] );
}
}
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ă.
- Aceasta este acum în propriul fișier, așa că nu veți vedea tipul de postare personalizat înregistrat.
- Am folosit un obiect pentru pagină conform exemplului 2 din codex-ul WordPress.
- 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();

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

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