Как преобразовать мета-поле WordPress Атрибуты страницы-> Шаблон страницы в переключатели? - PullRequest
1 голос
/ 28 января 2020

Я хотел бы иметь возможность изменить раскрывающийся список атрибутов страницы «Шаблоны» на переключатели, чтобы иметь рядом с ними соответствующие миниатюры.

Похоже, этот вопрос уже задавался здесь - Можно ли сделать так, чтобы опция мета-поля атрибута страницы WordPress отображалась в виде изображений? - однако ни один код не был предоставлен и просматривал комментарии похоже, что пользователь ответил на свой вопрос?

Я уже удалил и заменил мета-поле Атрибуты страницы для функций. php, как показано ниже:

add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
function wpse44966_add_meta_box( $post_type ){ 
    remove_meta_box(
        'pageparentdiv',
        'page',
        'side');
    add_meta_box(
        'wpse44966-meta-box',
        'page' == $post_type ? __('Page Style Templates') : __('Attributes'),
        'wpse44966_meta_box_cb', 
        'page', 
        'side', 
        'low');
}

Я тогда возможность вызывать выпадающий список «Шаблоны» в моем собственном мета-окне - я также включил функцию page_template_dropdown (переименованную в page_template_dropdown_show_it ').

function page_template_dropdown_show_it( $default = '', $post_type = 'page' ) {
    $templates = get_page_templates( null, $post_type );
    ksort( $templates );
    foreach ( array_keys( $templates ) as $template ) {
        $selected = selected( $default, $templates[ $template ], false );
        echo "\n\t<option value='" . esc_attr( $templates[ $template ] ) . "' $selected>" . esc_html( $template ) . '</option>';
    }
}

function wpse44966_meta_box_cb( $post ){
    echo 'Please select from the below'; 
    if ( count( get_page_templates( $post ) ) > 0 && get_option( 'page_for_posts' ) != $post->ID ) :
        $template = ! empty( $post->page_template ) ? $post->page_template : false;  ?>
        <p class="post-attributes-label-wrapper"><label class="post-attributes-label" for="page_template"><?php _e( 'Template' ); ?></label><?php do_action( 'page_attributes_meta_box_template', $template, $post ); ?></p>
        <select name="page_template" id="page_template">
            <?php $default_title = apply_filters( 'default_page_template_title', __( 'Default Template' ), 'meta-box' ); ?>
            <option value="default"><?php echo esc_html( $default_title ); ?></option>
            <?php page_template_dropdown_show_it( $template, $post->post_type ); ?>
        </select>
    <?php endif;
}

Однако когда я затем изменю page_template_dropdown_show_it и wpse44966_meta_box_cb для отображения переключателей, изменения применяются визуально, но при их выборе ничего не происходит?

function page_template_dropdown_show_it( $default = '', $post_type = 'page' ) {
    $templates = get_page_templates( null, $post_type );
    ksort( $templates );
    foreach ( array_keys( $templates ) as $template ) {
        $checked = checked( $default, $templates[ $template ], false );
        echo "\n\t<input type='radio' name='page_template' value='" . esc_attr( $templates[ $template ] ) . "' $checked>" . esc_html( $template );
    }
}

function wpse44966_meta_box_cb( $post ){
    echo 'Please select from the below'; 
    if ( count( get_page_templates( $post ) ) > 0 && get_option( 'page_for_posts' ) != $post->ID ) :
        $template = ! empty( $post->page_template ) ? $post->page_template : false;  ?>
        <p class="post-attributes-label-wrapper"><label class="post-attributes-label" for="page_template"><?php _e( 'Template' ); ?></label><?php do_action( 'page_attributes_meta_box_template', $template, $post ); ?></p>
            <?php $default_title = apply_filters( 'default_page_template_title', __( 'Default Template' ), 'meta-box' ); ?>
            <input type='radio' name='page_template' value="default"><?php echo esc_html( $default_title ); ?>
            <?php page_template_dropdown_show_it( $template, $post->post_type ); ?>
    <?php endif;
}

Это очевидно, не так просто, как прямой обмен (так как он не работает), но единственное, что я вижу, чего не хватает, так это теперь re - это ничто, несущее id = "page_template", тогда как раньше оно было включено в следующее:

<select name="page_template" id="page_template">

1 Ответ

0 голосов
/ 10 февраля 2020

Итак, похоже, я был прав, что проблема была в том, что id "page_template" больше не передавался.

Чтобы решить эту проблему, все, что я сделал, это применил некоторую Javascript (используя функцию admin_enqueue_scripts ), которая добавляет идентификатор "page_template" к выбранному переключателю.

...