当前位置: 首页 > 知识库问答 >
问题:

在其他帖子类型上使用Woocommerce product gallery元框

王扬
2023-03-14

我想添加一个元框到一个自定义的帖子类型,它的工作方式类似于Woocommerce使用的产品图库元框。我实际上在这个项目上安装了Woocommerce。

我找到了Woocommerce用来创建product gallery meta box的代码,我可以让meta box显示出来,但是jQuery没有用来拉出Wordpress用来添加图像的media lightbox。我不知道是否有一个钩子我需要添加或者我是否应该排队一个脚本?

<?php
function add_mtg_meta_boxes() {
    add_meta_box('mtg_hotel_gallery_meta_box', 'Hotel Gallery', 'setup_mtg_hotel_gallery_meta_box', 'meeting', 'side', 'low');
}

add_action('add_meta_boxes', 'add_mtg_meta_boxes');

function setup_mtg_hotel_gallery_meta_box($post) {
    echo '<input type="hidden" name="mtg_hotel_gallery_meta_box_nonce" value="'. wp_create_nonce('mtg_hotel_gallery_meta_box'). '" />';

?>

<div id="product_images_container">
<ul class="product_images">
    <?php
        if ( metadata_exists( 'post', $post->ID, '_product_image_gallery' ) ) {
            $product_image_gallery = get_post_meta( $post->ID, '_product_image_gallery', true );
        } else {
            // Backwards compatibility.
            $attachment_ids = get_posts( 'post_parent=' . $post->ID . '&numberposts=-1&post_type=attachment&orderby=menu_order&order=ASC&post_mime_type=image&fields=ids&meta_key=_woocommerce_exclude_image&meta_value=0' );
            $attachment_ids = array_diff( $attachment_ids, array( get_post_thumbnail_id() ) );
            $product_image_gallery = implode( ',', $attachment_ids );
        }
        $attachments         = array_filter( explode( ',', $product_image_gallery ) );
        $update_meta         = false;
        $updated_gallery_ids = array();
        if ( ! empty( $attachments ) ) {
            foreach ( $attachments as $attachment_id ) {
                $attachment = wp_get_attachment_image( $attachment_id, 'thumbnail' );
                // if attachment is empty skip
                if ( empty( $attachment ) ) {
                    $update_meta = true;
                    continue;
                }
                echo '<li class="image" data-attachment_id="' . esc_attr( $attachment_id ) . '">
                    ' . $attachment . '
                    <ul class="actions">
                        <li><a href="#" class="delete tips" data-tip="' . esc_attr__( 'Delete image', 'woocommerce' ) . '">' . __( 'Delete', 'woocommerce' ) . '</a></li>
                    </ul>
                </li>';
                // rebuild ids to be saved
                $updated_gallery_ids[] = $attachment_id;
            }
            // need to update product meta to set new gallery ids
            if ( $update_meta ) {
                update_post_meta( $post->ID, '_product_image_gallery', implode( ',', $updated_gallery_ids ) );
            }
        }
    ?>
</ul>

<input type="hidden" id="product_image_gallery" name="product_image_gallery" value="<?php echo esc_attr( $product_image_gallery ); ?>" />

</div>
<p class="add_product_images hide-if-no-js">
<a href="#" data-choose="<?php esc_attr_e( 'Add images to product gallery', 'woocommerce' ); ?>" data-update="<?php esc_attr_e( 'Add to gallery', 'woocommerce' ); ?>" data-delete="<?php esc_attr_e( 'Delete image', 'woocommerce' ); ?>" data-text="<?php esc_attr_e( 'Delete', 'woocommerce' ); ?>"><?php _e( 'Add product gallery images', 'woocommerce' ); ?></a>
</p>


<?php 

}

function save_mtg_hotel_gallery_meta_box($post_id) {
    // check nonce
    if (!isset($_POST['mtg_gallery_meta_box_nonce']) || !wp_verify_nonce($_POST['mtg_gallery_meta_box_nonce'], 'mtg_gallery_meta_box')) {
        return $post_id;
    }

    // check capabilities
    if ('meeting' == $_POST['post_type']) {
        if (!current_user_can('edit_post', $post_id)) {
            return $post_id;
        }
    } elseif (!current_user_can('edit_page', $post_id)) {
        return $post_id;
    }

    // exit on autosave
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }

    $attachment_ids = isset( $_POST['product_image_gallery'] ) ? array_filter( explode( ',', wc_clean( $_POST['product_image_gallery'] ) ) ) : array();
        update_post_meta( $post_id, '_product_image_gallery', implode( ',', $attachment_ids ) );
}

add_action('save_post', 'save_mtg_hotel_gallery_meta_box');

?>

共有1个答案

尚嘉庆
2023-03-14

首先要启用Wordpress Wp Media Uploader,您必须在Functions.php admin_enqueue_scripts钩子中使用wp_enqueue_media();

function enqueue_media_uploader() {
   wp_enqueue_media();
}
add_action( 'admin_enqueue_scripts', 'enqueue_media_uploader' );
<a href="#" id="add_product_image" data-choose="<?php esc_attr_e( 'Add images to product gallery', 'woocommerce' ); ?>" data-update="<?php esc_attr_e( 'Add to gallery', 'woocommerce' ); ?>" data-delete="<?php esc_attr_e( 'Delete image', 'woocommerce' ); ?>" data-text="<?php esc_attr_e( 'Delete', 'woocommerce' ); ?>"><?php _e( 'Add product gallery images', 'woocommerce' ); ?></a>
jQuery('#add_product_image').click(function(e) {
    e.preventDefault();
    var image = wp.media({ 
        title: 'Upload Image',
        multiple: false
    }).open()
    .on('select', function(e){
        var uploaded_image = image.state().get('selection').first();
        var image_url = uploaded_image.toJSON().url;
        var image_id = uploaded_image.toJSON().id;
    });
});
 类似资料:
  • 我正在研究post_type和分类学。我为它的主页创建了一个页面模板foo_template.php,在主页上我写了一个查询,显示所有分类法和相关的(5)五个帖子。当我点击任何分类法的新页面打开,它显示了点击分类法的所有帖子标题,其段塞是“foo_taxonomy”,我还为它创建了一个页面“taxonomy-foo_post.php”,当我点击任何标题时,它会出现在单页上我为它创造了“single

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Using Other Message Types 一节 可以使用其他消息类型作为字段类型. 例如, 假设你想在每个SearchResponse消息中包含Result消息 - 为了做到这点, 你可以在相同的.proto文件中定义Result消息类型然后具体指定SearchResponse中的一个字段为Result类型:

  • Firebase onMessageReceived方法提供remoteMessage实例以获取发送的消息或通知。如何将remoteMessage实例从扩展FirebaseMessagingService的类发送到RecolyerViewAdapter以更新RecolyerView中的项列表?

  • 我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类SPN、A和B。我重载了2次operator=。我想将A类型或B类型作为参数传递。 它不会抛出任何错误。但是如果我在类B或A中尝试make operator(),则使用参数SPN,如下所示: 它会抛出SPN未命名类型的错误。我甚至不能在A类或B类中创建类SPN对象。也许它不是如何客观编程工作,所以我想得到它,

  • 在我的帖子页面(常规帖子类型)中,我设置了一个ACF关系字段。在这个里面,我可以选择公司名称,这些名称都在directory_listings的职位类型下。 现在,我在directory listings页面上有以下代码,因此使用simply get_字段不起作用,因为这些值不在该页面上,而是在POST类型的其他位置。 因此不确定如何获取信息。 目录_LISTINGS post type下某个页面

  • 我想为wordpress构建一个简单的票证系统插件。因此,我需要一个自定义的帖子类型。但是,如果保存了此帖子类型,则其帖子状态应仅为“发布”。因此,用于发布的整个默认元框都有不必要的字段。我不想要post状态下拉列表,也不想要visiblity设置字段。奇怪的是,即使我在register_post_type的参数中将属性public设置为false,也会显示此字段。 据我所知,自定义post类型的