web-dev-qa-db-ja.com

ページ親の標準ページ属性メタボックスの追加

私はWord属性のeコマースプラグインによって私に提供されたカスタム投稿タイプ 'product'を持っていますが、これにはPage Attributes MetaboxのPage Parentを変更するオプションはありません。それを改善したいのですが。

私は この投稿 をWordpress StackExchangeで見つけましたが、それは特にPage Attributes MetaboxのPage Template要素を扱います。私の目的に合うように、この他のWSE質問で提供される非常に良い答えを誰かが推測できますか?すべてのページ属性メタボックスオプションを含めることもできます。 Page Parentまで削除する必要はありません。しかし、親ページは私が必要とするものです。


編集#2:これは私がこれまでに持っているものです。メタボックスは適切なドロップダウンで表示されますが、parent_idを保存できません。 admin/post.phpページが$ _POST ['parent_id']変数をキャッチしていないようです。非階層のカスタム投稿タイプに親IDを許可しないWordpressの機能はありますか?それとも、私はWoocommerceコードのどこかを探しているべきですか?

    function product_attributes_meta_box($post) {
        $dropdown_args = array(
            'post_type'        => 'page',
            'exclude_tree'     => $post->ID,
            'selected'         => $post->post_parent,
            'name'             => 'parent_id',
            'show_option_none' => __('(no parent)'),
            'sort_column'      => 'menu_order, post_title',
            'echo'             => 0,
            'child_of'         => 282, // Sales Page
        );

        $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
        $pages = wp_dropdown_pages( $dropdown_args );
        if ( ! empty($pages) ) {
?>
<p><strong><?php _e('Parent') ?></strong></p>
<label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
<?php echo $pages; ?>
<?php
        } // end empty pages check
    }
    add_action('add_meta_boxes','add_post_template_metabox');
    function add_post_template_metabox() {
        add_meta_box('postparentdiv', __('Page Parent'), 'product_attributes_meta_box', 'product', 'side', 'core');
    }
    add_action('save_post','save_post_parent',10,2);
    function save_post_parent($post_id,$post) {
      if ($post->post_type=='product' && !empty($_POST['parent_id'])
      ) {
        update_post_meta($post->ID,'_parent_id',$_POST['parent_id']);
      }
    }

編集#3:私はカスタム投稿タイプ 'product'をhierarchical => trueに変更しましたが、post.phpページはまだ$ _POST ['parent_id']変数をキャッチしていません。また、woocommerce.phpファイルのremove_meta_box( 'pageparentdiv', 'product', 'side' );をコメントアウトして上記のカスタムコードをすべて削除しようとしましたが、親ページはまだ保存されていません。

1
Timothy D

以下のリソースにはリストされていませんが、parent_id$_POSTおよび$_REQUESTでは予約名です。

このコードはWoocommerce商品ページで機能し、通常のページのドロップダウンを表示します。また、あなたのコードでは、selected引数の値を埋めるためのget_post_metaがありませんでした。

add_action( 'add_meta_boxes','add_metabox_wpse_83542' );
add_action( 'save_post', 'save_post_wpse_83542', 10, 2 );

function add_metabox_wpse_83542() 
{
    add_meta_box(
        'postparentdiv', 
        __('Page Parent'), 
        'meta_box_content_wpse_83542', 
        'product', 
        'side', 
        'core'
    );
}

function meta_box_content_wpse_83542( $post ) 
{
    $meta = get_post_meta( $post->ID, '_parent_id', true );
    $selected = ( isset( $meta ) ) ? $meta : '';
    $dropdown_args = array(
        'post_type'        => 'page',
        'exclude_tree'     => $post->ID,
        'selected'         => $selected,
        'name'             => '_parent_id',
        'show_option_none' => __( '(no parent)' ),
        'sort_column'      => 'menu_order, post_title',
        'echo'             => 0,
        'child_of'         => 97, // Sales Page
    );

    $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
    $pages = wp_dropdown_pages( $dropdown_args );

    if ( ! empty($pages) ) 
    {
        wp_nonce_field( plugin_basename( __FILE__ ), 'noncename_wpse_83542' );          
        ?>
        <p><strong><?php _e('Parent') ?></strong></p>
        <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
        <?php 
        echo $pages; 
    } // end empty pages check
}    

function save_post_wpse_83542( $post_id, $post ) 
{
    // Block on Autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )  
        return;

    // Block Revisions
    if ( 'revision' == $post->post_type )
        return;

    // Nonce verify
    if ( !wp_verify_nonce( $_POST['noncename_wpse_83542'], plugin_basename( __FILE__ ) ) )
        return;

    if ( $post->post_type == 'product' && !empty( $_POST['_parent_id'] ) ) 
    {
        update_post_meta( $post->ID, '_parent_id', $_POST['_parent_id'] );
    }
}
1
brasofilo