3

WordPress ウェブサイトに Elementor Pro をインストールしており、いくつかの処理を実行してプログラムで新しいページを作成するカスタム プラグインを作成していました。ページを作成できましたが、問題は、この新しいページ内にプログラムで Elementor ウィジェットを挿入したいということです。

Elementorサポートに連絡して、彼らが私に何か入力があるかどうかを確認しました. しかし、彼らの答えは次のとおりです。

Elementor の既存の機能のみをサポートしているため、カスタム コード/スニペットまたはこれに関するガイダンスはサポートの範囲を超えています。

コードを介してこれを達成できる方法はありますか?つまり、特定の Elementor ウィジェットをページに挿入しますか?

4

1 に答える 1

7

これは最善の解決策ではありませんが、回避策を見つけた方法を説明します。

私にとっては、WordPress Web サイトのデータベースを監視して、Elementor で新しいページを作成したときにすべての変更が発生していることを確認してみました。私が監視したテーブルは次wp_postsのとおりwp_postmetaです。wp_WordPress のインストール時に別の接頭辞を選択した場合は、接頭辞が異なる可能性があることに注意してください。

ページを作成すると、値wp_postsを持つ新しい行がテーブルに挿入されます。その値を書き留めます (説明のために、 be とします)。post_typepagepost_idpost_id123

このページのメタデータはwp_postmetaテーブルに保存され、Elementor は各ページまたは投稿に関連するデータをそこに保存します。phpMyAdmin を使用してそのテーブルにアクセスし、(ページの ID はpost_id = 123こちら)を持つレコードを検索しました。次のように、(テーブルを選択した後) phpMyAdminの [検索123] タブを使用できます。wp_postmeta

ここに画像の説明を入力

または、 phpMyAdminのSQL タブで次のようなクエリを実行できます。

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

これで、ページに添付されたすべてのメタデータ (ID 付き123) が表示されます。

ここに画像の説明を入力

私の場合、123以前にこのページ (ID) の Elementor に 1 つのウィジェットを追加していました。したがって、上の画像でわかるように、いくつかのメタデータが添付されています。

これは、Page のTemplate Attribute_wp_page_template = page-fullwidth.phpに を選択したためです。Full Width

ここに画像の説明を入力

そして、ページが Elementor を使用して作成されていることを理解させるには、次の 2 つの値が必要なようです。

_elementor_edit_mode = builder
_elementor_template_type = wp-page

ですから、それは間違いなく必要です。次に、Elementor のバージョン値について:

_elementor_version = 2.9.14
_elementor_pro_version = 2.10.3

定数を使用できます: ELEMENTOR_VERSION(Elementor プラグインの無料バージョンがあるELEMENTOR_PRO_VERSION場合) および (Pro バージョン プラグインがある場合)。Elementor プラグインのそれぞれのバージョン (無料またはプロ) がインストールされている場合、これらの定数は既に定義されています。

次に重要な部分です。ウィジェットのデータとレイアウト関連のデータは、:_elementor_data_elementor_controls_usageメタキーに格納されているようです。

の値は_elementor_dataJSON 文字列のようです。したがって、任意のオンライン 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
  }
]

以前にそのウィジェットを自分のページに追加し、タグ ID 入力ボックスに21(Elementor Editor を介して) の値を設定したので、それを置き換える新しい値を渡す必要があることがわかりました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:{}}}

シリアル化されたデータです。そのデータのシリアル化を解除するには、任意のオンライン ツールを使用できます。シリアル化解除後の私の外観は次のとおりです。

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 (
    ),
  ),
)

そして、基本的にはレイアウト関連のデータのようです。なので、この値は編集せずそのまま使うことにしました。


最後の料理をしましょう

ページの作成には、挿入後に new を返す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}]' );

これは完璧な解決策ではないことに注意してください。しかし、この問題の回避策をどのように見つけたかを説明しました。

たぶん、他の誰かがより良い解決策を投稿しているでしょう。;)

于 2020-09-18T19:40:29.023 に答える