Cómo volver a renderizar el widget de publicaciones de Elementor con una llamada ajax

2 minutos de lectura

Estoy trabajando con Elementor en WordPress. Muestro mi tipo de publicación personalizada con el widget de publicaciones. Creé un filtro AJAX que además filtra mis publicaciones por diferentes valores, lo que funciona hasta ahora.

Ahora me enfrento al problema de que no puedo volver a renderizar el elemento o el widget de publicación. Esto es obligatorio para obtener los resultados filtrados dentro del widget porque elementor solo permite el filtrado del sitio del servidor de forma predeterminada.

Estoy usando el filtro de consulta personalizado (https://developers.elementor.com/custom-query-filter/) para insertar los resultados del filtro en el widget elementor post.

Básicamente, mi pregunta es si hay una función elementor a la que pueda llamar con ajax para volver a renderizar los widgets elementor.

  • hola, tal vez ajax_render_widget: code.elementor.com/methods/… puede ser de ayuda para eso, pero realmente no lo he usado, así que no puedo dar una respuesta adecuada.

    – Andreas Myriounis

    16 de noviembre de 2020 a las 16:54

Avatar de usuario de Mikepote
micropote

Me tomó un tiempo resolver esto, pero tengo un método que funciona:

  1. Debe pasar la ID de la publicación actual y la ID del widget a su método AJAX:

ID del widget: Se puede encontrar en el contenedor div de su widget en el data-id atributo.

ID del mensaje: Elementor en realidad ya almacena esto en un javascript global: window.elementorFrontendConfig.post.id

  1. Dentro de su acción AJAX, use la siguiente función para representar un widget desde la ID de publicación y la ID de widget especificadas:
function render_element($postid, $elementid)
{
    $document = \Elementor\Plugin::$instance->documents->get( $postid );

    if ( ! $document ) {
        return new \WP_Error(
            'document_not_exist',
            __( 'Document doesn\'t exist', 'elementor-pro' ),
            [ 'status' => 404 ]
        );
    }

    $element_data = $document->get_elements_data();
    $widget = \Elementor\Utils::find_element_recursive( $element_data, $elementid );

    if ( empty( $widget ) ) {
        return new \WP_Error(
            'Element_not_exist',
            __( 'Posts widget doesn\'t exist', 'elementor-pro' ),
            [ 'status' => 404 ]
        );
    }

    // Override the global $post for the render.
    query_posts(
        [
            'p' => $postid,
            'post_type' => 'any',
        ]
    );

    \Elementor\Plugin::$instance->documents->switch_to_document( $document );
    $html = $document->render_element($widget);

    //Not sure if this is needed in AJAX context:
    // \Elementor\Plugin::$instance->documents->restore_document();
    // \wp_reset_query();

    return [
        'content' => $html,
    ];
}

¿Ha sido útil esta solución?