गुटेनबर्ग में गैलरी ब्लॉक का विस्तार कैसे करें?


16

कोर में शामिल किए जाने से पहले मैं गुटेनबर्ग के साथ खेल रहा हूं, और मैं जानना चाहता हूं कि अपने प्रदर्शन को बदलने के लिए मौजूदा गैलरी ब्लॉक का विस्तार कैसे किया जाए। उदाहरण के लिए, थंबनेल के ग्रिड के बजाय मैं छवियों का स्लाइड शो दिखाना चाहूंगा। क्या यह संभव है? यदि हां, तो कैसे? किसी भी सहायता की सराहना की जाएगी।


1
वहाँ पर एक अध्याय है तानाना गुटेनबर्ग हैंडबुक में, कि हो सकता है से उन फ़िल्टर अगर पहला कदम देखने के लिए संशोधित करना ब्लाकों हिस्सा इस मामले के लिए उपयोग किया जा सकता ..
birgire

ऐसा लगता है कि इस अध्याय को हाल ही में जोड़ा गया है। मैंने इसे पहले नहीं देखा था। किसी भी मामले में, जैसा कि यह प्रायोगिक के रूप में चिह्नित है, यह सुविधा बदलने के लिए प्रवण है। मैं स्थिर होने तक प्रतीक्षा करूँगा। धन्यवाद!
लेमन

निम्नलिखित डॉक आज तक अधिक है: github.com/WordPress/gutenberg/blob/master/docs/…
leemon

जवाबों:


16

ठीक है, मैं इसके साथ थोड़े समय के लिए खेल रहा हूं और निम्नलिखित चेतावनी के साथ गैलरी ब्लॉक का आउटपुट बदलने में कामयाब रहा:

  • पूर्वावलोकन आउटपुट से मेल नहीं खाता है। मुझे लगता है कि यह संभव है लेकिन थोड़ा और अधिक शामिल प्रतीत होता है।
  • आउटपुट को पार्स करने में सक्षम होने और इसे संपादन योग्य बनाए रखने के लिए आउटपुट में कुछ वर्गों और मार्कअप की आवश्यकता होती है। इन वर्गों में फ्रंट-एंड स्टाइल हैं जिनसे निपटने की आवश्यकता होगी। मैं इस बिंदु पर निश्चित नहीं हूं कि अगर फ़िल्टर करने का कोई तरीका है कि ब्लॉक यह कैसे करता है। यदि यह संभव था तो यह भी एक अच्छा विचार नहीं हो सकता है अगर इसका मतलब है कि किसी विषय या प्लगइन को निष्क्रिय करने पर गैलरी ब्लॉक टूट गए हैं। एक पूरी तरह से नया ब्लॉक संभवतः उन स्थितियों के लिए जाने का रास्ता होगा जहां इसकी आवश्यकता होगी।
  • मुझे वास्तव में यकीन नहीं है कि इस स्तर पर छवि का आकार कैसे काम करता है।
  • जावास्क्रिप्ट हुक का उपयोग अंतिम रिलीज में प्रासंगिक नहीं हो सकता है। गुटेनबर्ग @wordpress/hooksकोर में उपयोग करने के लिए हुक प्रणाली के बारे में चर्चा करते हुए उपयोग करता है
  • चूंकि ब्लॉक का आउटपुट HTML के रूप में सहेजा जाता है, शोर्ट या मेटा के रूप में नहीं, इसलिए उन्हें संपादित किए बिना मौजूदा गैलरियों के आउटपुट को संशोधित करना संभव नहीं होगा।

पहली चीज जो हमें करने की ज़रूरत है वह एक स्क्रिप्ट को पंजीकृत करना है। इसके साथ किया जाता है wp_enqueue_scripts(), लेकिन enqueue_block_editor_assetsहुक पर।

स्क्रिप्ट पर wp-blocksनिर्भरता के रूप में स्क्रिप्ट होनी चाहिए । यह लगभग निश्चित रूप से पहले से ही संपादक में लोड किया गया है, लेकिन इसे एक निर्भरता बनाने के लिए संभवतः यह सुनिश्चित करता है कि यह हमारी स्क्रिप्ट से पहले लोड हो।

function wpse_298225_enqueue_block_assets() {
    wp_enqueue_script(
        'wpse-298225-gallery-block',
        get_theme_file_uri( 'block.js' ),
        ['wp-blocks']
    );
}
add_action( 'enqueue_block_editor_assets', 'wpse_298225_enqueue_block_assets' );

ब्लॉक के आउटपुट के लिए HTML को ब्लॉक की save()विधि द्वारा नियंत्रित किया जाता है । आप इस फाइल में गैलरी ब्लॉक देख सकते हैं ।

इस स्तर पर (मार्च 2018) गुटेनबर्ग ने ब्लॉकों की बचत विधि पर एक फिल्टर का समर्थन किया है blocks.getSaveElement। हम इस तरह जावास्क्रिप्ट में एक हुक जोड़ सकते हैं:

wp.hooks.addFilter(
    'blocks.getSaveElement',
    'wpse-298225',
    wpse298225GallerySaveElement
)

पहला तर्क हुक नाम है, दूसरा तर्क है - मुझे लगता है - एक नाम स्थान, और अंतिम तर्क कॉलबैक फ़ंक्शन है।

चूंकि हम save()ब्लॉक की विधि की जगह ले रहे हैं , हमें एक नया तत्व वापस करने की आवश्यकता है। हालाँकि, यह एक सामान्य HTML तत्व नहीं है जिसे हमें वापस करने की आवश्यकता है। हमें एक प्रतिक्रिया तत्व को वापस करने की आवश्यकता है ।

जब आप मूल ब्लॉक की save()विधि को देखते हैं तो आप जो देखते हैं वह JSX है। रिएक्ट, जो गुटेनबर्ग अंडर-द-हूड का उपयोग करता है, इसे रेंडरिंग तत्वों के लिए समर्थन करता है। उस पर और अधिक के लिए यह लेख देखें ।

JSX को आम तौर पर एक बिल्ड स्टेप की आवश्यकता होती है, लेकिन जब से मैं इस उदाहरण के लिए बिल्ड स्टेप पेश नहीं कर रहा हूं, हमें JSX के बिना एक तत्व बनाने का तरीका चाहिए। रिएक्ट इसे प्रदान करता है createElement()। वर्डप्रेस इसके लिए एक आवरण प्रदान करता है और अन्य प्रतिक्रिया कार्यक्षमता के रूप में wp.element। इसलिए उपयोग करने के लिए createElement()हम उपयोग करते हैं wp.element.createElement()

कॉलबैक फ़ंक्शन में blocks.getSaveElementहमें मिलता है:

  • element ब्लॉक द्वारा बनाया गया मूल तत्व।
  • blockType उपयोग की जा रही ब्लॉक का प्रतिनिधित्व करने वाली वस्तु।
  • attributesब्लॉक उदाहरण के गुण। हमारे उदाहरण में इसमें गैलरी में चित्र और कॉलम की संख्या जैसी सेटिंग्स शामिल हैं।

तो हमारे कॉलबैक फ़ंक्शन की आवश्यकता है:

  • गैर-ब्लॉक दीर्घाओं के लिए मूल तत्व लौटाएं।
  • विशेषताओं, विशेष रूप से छवियों को लें, और गैलरी का प्रतिनिधित्व करते हुए उनमें से एक नया रिएक्ट तत्व बनाएं।

यहां एक पूर्ण उदाहरण है जो केवल ulएक वर्ग के साथ आउटपुट करता है my-gallery, और liप्रत्येक छवि के लिए वर्ग के साथ my-gallery-itemऔर imgप्रत्येक srcमें छवि URL पर सेट के साथ है ।

function wpse298225GallerySaveElement( element, blockType, attributes ) {
    if ( blockType.name !== 'core/gallery' ) {
        return element;
    }

    var newElement = wp.element.createElement(
        'ul',
        {
            'className': 'wp-block-gallery my-gallery',
        },
        attributes.images.map(
            function( image ) {
                return wp.element.createElement(
                    'li',
                    {
                        'className': 'blocks-gallery-item my-gallery-item',
                    },
                    wp.element.createElement(
                        'img',
                        {
                            'src': image.url,
                        }
                    )
                )
            }
        )
    )

    return newElement
}

कुछ बातों का ध्यान रखना चाहिए:

  • मूल गैलरी ब्लॉक छवियों को ढूंढती है ul.wp-block-gallery .blocks-gallery-item, इसलिए ब्लॉक को संपादित करने के लिए यह मार्कअप और उन कक्षाओं की आवश्यकता होती है। यह मार्कअप डिफ़ॉल्ट स्टाइल के लिए भी उपयोग किया जाता है।
  • attributes.images.mapप्रत्येक छवि पर लूपिंग है और मुख्य तत्व के लिए सामग्री के रूप में बाल तत्वों की एक सरणी लौटाता है। इन तत्वों के अंदर छवि के लिए एक और बाल तत्व है।

2

यहाँ एक अद्यतन जवाब देने के लिए। मैंने गैलरी ब्लॉक को कैसे बढ़ाया जाए, इस सवाल का जवाब देने में इस पोस्ट को बेहद मददगार पाया ।

संक्षेप में, किसी मौजूदा का विस्तार करने के बजाय एक नया ब्लॉक बनाने की सलाह दी जाती है। ऊपर मेरे लिंक में पोस्ट से:

यदि आप किसी ब्लॉक के HTML को [विस्तार से] संशोधित करते हैं, तो इसे मूल ब्लॉक के रूप में मान्यता नहीं दी जाएगी। एक कोर ब्लॉक में हेरफेर करने की कोशिश करने के बजाय ऐसा लगता है जैसे कोर ब्लॉक को अनरजिस्ट्रेट करना और उसकी जगह एक नया रिप्लेसमेंट ब्लॉक दर्ज करना एक सुरक्षित दृष्टिकोण होगा - इस तरह से आप साइट के उपयोगकर्ताओं को आपकी विशेष अनुकूलित गैलरी का उपयोग करना सुनिश्चित कर रहे हैं, जो मान्य होगा यह अपनी स्वयं की HTML संरचना को परिभाषित करता है।

उपरोक्त लिंक भी Create-Guten_Block प्लगइन को संदर्भित करता है, जो एक कमांड-लाइन टूल है, जो आपको ब्लॉक बनाने के साथ शुरू करने के लिए आवश्यक सब कुछ उत्पन्न करेगा। उपकरण का उपयोग करना बहुत आसान है, और आसान सेटअप है।

इन संसाधनों के साथ, मैं यह पता लगाने में सक्षम था कि थोड़े समय में कस्टम गैलरी ब्लॉक कैसे विकसित किया जाए


क्या आपके पास गैलरी ब्लॉक बनाने के लिए कोई और सुझाव हैं? यह मुझे लगता है कि सभी आवश्यक सीआरयूडी कार्यों का समर्थन करने के लिए संपादक की ओर से एक महत्वपूर्ण राशि है। कोर WP सॉल्यूशन इमेज को अपलोड करने से लेकर उनकी छँटाई करने, नए जोड़ने, मौजूदा को डिलीट करने आदि से सबकुछ हैंडल करता है। जिस तरह से मैं यह देख रहा हूं कि यह उसी तरह की कार्यक्षमता को फिर से बनाने के लिए बहुत काम आता है जैसे- बॉक्स सिर्फ दृश्य को अनुकूलित करने के लिए।
phip

@ इसके बारे में 6 महीने हो गए हैं जब से मैं गुटेनबर्ग ब्लॉकों में गहरी थी, और मुझे पता है कि इसके बारे में बहुत कुछ बदल गया है। यदि आप मुझे सही तरीके से समझते हैं, तो मैं आपसे सहमत हूं। यह क्रूड संचालन का प्रबंधन करने के लिए कस्टम इंटरफेस को बुझाने के लिए भारी लगता था। उन्नत कस्टम फ़ील्ड प्रो संस्करण आपको ब्लॉक के लिए कस्टम डेटा स्कीमा बनाने की अनुमति देता है। अधिक जानकारी के लिए, https://www.advancedcustomfields.com/resources/blocks/ । हालांकि मुझे ब्लॉक बनाने के लिए रिएक्ट का उपयोग करना सीखना अच्छा लगा, लेकिन ACF का उपयोग करना एक बड़ा समय बचाने वाला था।
जेफ विल्करसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.