• Buenas tardes. Estoy haciendo un sitio usando el tema «twenty-twenty-four». Necesito que el extracto pueda mostrar HTML, más específicamente un link. He probado con varias sugerencias que encontré online pero ninguna ha servido. Gracias.

    La página con la que necesito ayuda: [accede para ver el enlace]

Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • Moderador almendron

    (@almendron)

    Es un código antiguo, pero creo que te funcionará: https://ayudawp.com/formatos-en-los-extractos-automaticos/

    Iniciador del debate clau_bolson

    (@clau_bolson)

    Gracias por tu respuesta, el problema es que parece que esta plantilla NO TIENE «the_excerpt», eso estaba en las muchas sugerencias que encontré online

    Moderador almendron

    (@almendron)

    ¿Has comprobado si aparece el extracto cuando añades a cada entrada el bloque de extracto?

    Hola @clau_bolson!

    Si estas utilizando el bloque post-excerpt, este está aplicando un filtro para quitar cualquier tag HTML. Hay una issue abierta sbre esto: https://github.com/WordPress/gutenberg/issues/49449

    Una solución que funciona en twenty-twenty-four (y diría que en cualquier tema de bloques) es esta compartida por @dufresnesteven en la issue

    function filter_post_excerpt_attrs( $metadata ) {
        if ( 'core/post-excerpt' === $metadata['name'] ) {
            $metadata["attributes"]["excerptLength"] = false;
        }
    
        return $metadata;
    };
    
    add_filter( 'block_type_metadata', 'filter_post_excerpt_attrs', 10 );

    Lo que hace este codigo es «desactivar» el atributo excerptLength (evalua a true por defecto) que es el que provoca la aplicación de wp_trim_words sobre el excerpt y que internamente aplica wp_strip_all_tags

    Espero que te sirva de ayuda!

    El tema de que el excerpt no pueda mostar custom tags es definitivamente un bug que habría que solucionar.

    @greenshady ha compartido hace una horas esta solución que admite tags especificos respetando el seteo del attributo excerptLength

    <?php 

    // Add a filter on
    pre_render_block to determine if the excerpt is manual. If
    // so, add a filter to wp_trim_words to handle formatting ourself.

    add_filter('pre_render_block', 'themeslug_pre_render_excerpt', 10, 3);

    function themeslug_pre_render_excerpt(
    ?string $pre_render,
    array $block,
    ?WP_Block $parent_block
    ): ?string {
    if (
    'core/post-excerpt' === $block['blockName']
    && is_null($pre_render)
    && ! is_null($parent_block)
    && isset($parent_block->context['postId'])
    && has_excerpt($parent_block->context['postId'])
    ) {
    add_filter('wp_trim_words', 'themeslug_format_excerpt', 10, 4);
    }

    return $pre_render;
    }

    // Add a filter to Post Excerpt block to remove the filter we added earlier on
    // the wp_trim_words hook.

    add_filter('render_block_core/post-excerpt', 'themeslug_render_post_excerpt');

    function themeslug_render_post_excerpt(string $content): string
    {
    if ($priority = has_filter('wp_trim_words', 'themeslug_format_excerpt')) {
    remove_filter('wp_trim_words', 'themeslug_format_excerpt', $priority);
    }

    return $content;
    }

    // Used to filter wp_trim_words to allow manual excerpts to work, limiting to
    // a subset of inline HTML tags.

    function themeslug_format_excerpt(
    string $text,
    int $num_words,
    string $more,
    string $original_text
    ): string {
    return wp_kses($original_text, [
    'a' => [ 'href' => true, 'title' => true, 'class' => true ],
    'abbr' => [ 'title' => true ],
    'acronym' => [ 'title' => true ],
    'bold' => [ 'class' => true ],
    'code' => [ 'class' => true ],
    'em' => [ 'class' => true ],
    'i' => [ 'class' => true ],
    'mark' => [ 'class' => true ],
    'small' => [ 'class' => true ],
    'span' => [ 'class' => true ],
    'strong' => [ 'class' => true ]
    ]);
    }
    • Esta respuesta fue modificada hace 4 meses, 2 semanas por JuanMa Garrido.
Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • Debes estar registrado para responder a este debate.