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

मैंने एलिमेंट सपोर्ट से संपर्क किया है यह देखने के लिए कि क्या उनके पास मेरे लिए कोई इनपुट है। लेकिन उनका जवाब है:

इसमें मैं आपकी जितनी सहायता करना चाहता हूं, कस्टम कोड/स्निपेट या इसके लिए कोई मार्गदर्शन हमारे समर्थन के दायरे से बाहर है, यह देखते हुए हम केवल एलीमेंटर की मौजूदा सुविधाओं के लिए सहायता प्रदान करते हैं।

तो क्या वैसे भी मैं इसे कोड के माध्यम से प्राप्त कर सकता हूं, मेरा मतलब है कि किसी पृष्ठ पर एक विशिष्ट एलिमेंटर विजेट डालें?

3
Vpp Man 15 सितंबर 2020, 12:17

1 उत्तर

सबसे बढ़िया उत्तर

यह सबसे अच्छा समाधान नहीं होगा, लेकिन मैं समझाऊंगा कि मैंने एक समाधान कैसे निकाला।

मेरे लिए, मैंने अपने वर्डप्रेस वेबसाइट के डेटाबेस की निगरानी करने की कोशिश की, यह देखने के लिए कि जब मैं एलीमेंटर के साथ एक नया पेज बनाता हूं तो सभी परिवर्तन क्या हो रहे हैं। जिन तालिकाओं की मैंने निगरानी की वे हैं: wp_posts और wp_postmeta। कृपया ध्यान दें कि wp_ उपसर्ग आपके मामले में भिन्न हो सकता है, यदि आपने वर्डप्रेस स्थापित करते समय एक अलग चुना था।

जब आप कोई पृष्ठ बनाते हैं, तो wp_posts तालिका में post_type मान page के साथ एक नई पंक्ति सम्मिलित हो जाती है। ध्यान दें कि post_id मान (स्पष्ट करने के लिए, post_id को 123 होने दें)।

इस पृष्ठ के लिए मेटाडेटा wp_postmeta तालिका में संग्रहीत किया जाएगा, और यहीं पर Elementor प्रत्येक पृष्ठ या पोस्ट से संबंधित अपने डेटा को संग्रहीत करता है। PhpMyAdmin का उपयोग करके, मैंने उस तालिका तक पहुँच प्राप्त की और उन अभिलेखों की खोज की जिनमें post_id = 123 (यहाँ 123 पृष्ठ की आईडी है)। आप phpMyAdmin के खोज टैब का उपयोग कर सकते हैं (wp_postmeta तालिका का चयन करने के बाद) इस प्रकार:

enter image description here

या, phpMyAdmin के SQL Tab में इस तरह की क्वेरी चला सकता है:

SELECT * FROM `wp_postmeta` WHERE `post_id` = 123

अब आप हमारे पेज से जुड़े सभी मेटाडेटा (आईडी 123 के साथ) देखेंगे।

enter image description here

मेरे मामले में, मैंने पहले ही इस पेज (आईडी 123) के लिए एलिमेंटर में एक विजेट जोड़ा था। तो, जैसा कि आप ऊपर की छवि में देख सकते हैं, इसमें कुछ मेटाडेटा संलग्न है।

वह _wp_page_template = page-fullwidth.php इसलिए है क्योंकि मैंने अपने पेज की टेम्पलेट विशेषता के लिए Full Width को चुना था:

enter image description here

और इन दो मानों को यह समझने के लिए आवश्यक लगता है कि पेज एलिमेंटर का उपयोग करके बनाया गया है:

_elementor_edit_mode = builder
_elementor_template_type = wp-page

तो हमें निश्चित रूप से इसकी आवश्यकता है। फिर एलिमेंट संस्करण मानों के लिए:

_elementor_version = 2.9.14
_elementor_pro_version = 2.10.3

आप स्थिरांक का उपयोग कर सकते हैं: ELEMENTOR_VERSION (यदि आपके पास Elementor प्लगइन का मुफ़्त संस्करण है) और ELEMENTOR_PRO_VERSION (यदि आपके पास प्रो संस्करण प्लगइन है)। ये स्थिरांक पहले से ही परिभाषित हैं यदि आपके पास एलिमेंटर प्लगइन का संबंधित संस्करण (फ्री या प्रो) स्थापित है।

इसके बाद महत्वपूर्ण भाग आता है, विजेट का डेटा और लेआउट संबंधी डेटा : _elementor_data और _elementor_controls_usage मेटाकी में संग्रहीत होता है।

_elementor_data का मान JSON स्ट्रिंग लगता है। तो आप किसी भी ऑनलाइन JSON पार्सर का उपयोग करके देख सकते हैं कि इसमें क्या है। मेरे मामले में मूल्य इस तरह था:

[{"id":"2e0569b","elType":"section","settings":[],"elements":[{"id":"e2a6dbb","elType":"column","settings":{"_column_size":100,"_inline_size":null},"elements":[{"id":"441552a","elType":"widget","settings":{"tag_ids":"21"},"elements":[],"widgetType":"listings_grid_new"}],"isInner":false}],"isInner":false}]

जब पार्स किया जाता है, तो यह इस तरह दिखेगा:

[
  {
    "id": "2e0569b",
    "elType": "section",
    "settings": [],
    "elements": [
      {
        "id": "e2a6dbb",
        "elType": "column",
        "settings": {
          "_column_size": 100,
          "_inline_size": null
        },
        "elements": [
          {
            "id": "441552a",
            "elType": "widget",
            "settings": {
              "tag_ids": "21"
            },
            "elements": [],
            "widgetType": "listings_grid_new"
          }
        ],
        "isInner": false
      }
    ],
    "isInner": false
  }
]

चूंकि मैंने पहले उस विजेट को अपने पृष्ठ पर जोड़ा था, और टैग आईडी इनपुट बॉक्स को 21 (एलिमेंटर संपादक के माध्यम से) के मान के साथ सेट किया था, इसलिए मैं समझ गया कि मुझे उस 21 के स्थान पर नया मान पास करना होगा।

इसके बाद _elementor_controls_usage मेटाकी आता है। और इसका मूल्य इस प्रकार था:

a:3:{s:17:"listings_grid_new";a:3:{s:5:"count";i:1;s:15:"control_percent";i:1;s:8:"controls";a:1:{s:7:"content";a:1:{s:13:"section_query";a:2:{s:7:"loc_ids";i:1;s:7:"tag_ids";i:1;}}}}s:6:"column";a:3:{s:5:"count";i:1;s:15:"control_percent";i:0;s:8:"controls";a:1:{s:6:"layout";a:1:{s:6:"layout";a:1:{s:12:"_inline_size";i:1;}}}}s:7:"section";a:3:{s:5:"count";i:1;s:15:"control_percent";i:0;s:8:"controls";a:0:{}}}

यह क्रमबद्ध डेटा है। आप किसी भी उस डेटा को क्रम से हटाने के लिए ऑनलाइन टूल का उपयोग कर सकते हैं। यहाँ मेरा क्या दिखता है unserializing के बाद:

array (
  'listings_grid_new' => 
  array (
    'count' => 1,
    'control_percent' => 1,
    'controls' => 
    array (
      'content' => 
      array (
        'section_query' => 
        array (
          'loc_ids' => 1,
          'tag_ids' => 1,
        ),
      ),
    ),
  ),
  'column' => 
  array (
    'count' => 1,
    'control_percent' => 0,
    'controls' => 
    array (
      'layout' => 
      array (
        'layout' => 
        array (
          '_inline_size' => 1,
        ),
      ),
    ),
  ),
  'section' => 
  array (
    'count' => 1,
    'control_percent' => 0,
    'controls' => 
    array (
    ),
  ),
)

और यह मूल रूप से लेआउट से संबंधित डेटा जैसा दिखता है। इसलिए मैंने सोचा कि इस मूल्य का कोई संपादन नहीं करना चाहिए, और इसका उपयोग वैसे ही करना चाहिए जैसा वह है।


आखिरी चीज़ पकाते हैं

पेज बनाने के लिए, मैंने wp_insert_post() तरीके का इस्तेमाल किया, जो नई page_id प्रविष्टि के बाद। और पेज बनाने के बाद, मैंने इसे पास करते हुए update_post_meta() मेथड का इस्तेमाल किया। page_id और मेटाडेटा संलग्न किया।

मेरा अंतिम कोड इस तरह दिखेगा:

//-- set the new page arguments
$new_page_args = array(
    'post_type'     => 'page',              //-- this is of type 'page'
    'post_title'    => 'My Dynamic Page',   //-- title of the page              
    'post_status'   => 'publish'            //-- publish the page
);

//-- insert the page
$new_page_id = wp_insert_post( $new_page_args );

if( is_wp_error( $new_page_id ) )
{
    echo 'Unable to create the page!';        
    die;
}

if( defined( 'ELEMENTOR_VERSION' ) )    //-- if FREE version of Elementor plugin is installed
{
    update_post_meta( $new_page_id, '_elementor_version', ELEMENTOR_VERSION );
}

if( defined( 'ELEMENTOR_PRO_VERSION' ) )    //-- if PRO version of Elementor plugin is installed
{
    update_post_meta( $new_page_id, '_elementor_pro_version', ELEMENTOR_PRO_VERSION );
}

update_post_meta( $new_page_id, '_wp_page_template', 'page-fullwidth.php' );    //-- for using full width template

//-- for Elementor
update_post_meta( $new_page_id, '_elementor_edit_mode', 'builder' );
update_post_meta( $new_page_id, '_elementor_template_type', 'wp-page' );

//-- Elementor layout
update_post_meta( $new_page_id, '_elementor_controls_usage', 'a:3:{s:17:"listings_grid_new";a:3:{s:5:"count";i:1;s:15:"control_percent";i:1;s:8:"controls";a:1:{s:7:"content";a:1:{s:13:"section_query";a:2:{s:7:"loc_ids";i:1;s:7:"tag_ids";i:1;}}}}s:6:"column";a:3:{s:5:"count";i:1;s:15:"control_percent";i:0;s:8:"controls";a:1:{s:6:"layout";a:1:{s:6:"layout";a:1:{s:12:"_inline_size";i:1;}}}}s:7:"section";a:3:{s:5:"count";i:1;s:15:"control_percent";i:0;s:8:"controls";a:0:{}}}' );

$tag_id = '56'; //-- new value
//-- Elementor data ( I have injected the new $tag_id value in the string )
update_post_meta( $new_page_id, '_elementor_data', '[{"id":"2e0569b","elType":"section","settings":[],"elements":[{"id":"e2a6dbb","elType":"column","settings":{"_column_size":100,"_inline_size":null},"elements":[{"id":"441552a","elType":"widget","settings":{"tag_ids":"'. $tag_id .'"},"elements":[],"widgetType":"listings_grid_new"}],"isInner":false}],"isInner":false}]' );

ध्यान रखें, यह सही समाधान नहीं है। लेकिन मैंने समझाया कि मैंने इस समस्या का समाधान कैसे निकाला।

शायद कोई और बेहतर समाधान पोस्ट कर रहा होगा। ;)

4
Dharman 18 सितंबर 2020, 22:46