Site logo

Archived topic

Customised elements

5 replies · Started by Javier on October 12, 2022

Viewing posts 1–6 of 6

Hi, I need to put a custom element that for example appears on all pages after the third paragraph, how can I do it?

Hi Javier,

1. Try add this PHP code:

add_shortcode('portable_hook', function($atts){
	ob_start();
        $atts = shortcode_atts( array(
            'hook_name' => 'no foo'
        ), $atts, 'portable_hook' );
		do_action($atts['hook_name']);
	return ob_get_clean();
});

add_filter( 'the_content', 'insert_element', 20 );
function insert_element( $content ) {
    global $post;
    $inserted_hook = do_shortcode('[portable_hook hook_name="after_third_paragraph"]');
    if ( is_single() && ! is_admin() ) {
        return prefix_insert_after_paragraph( $inserted_hook, 3, $content );
    }
    return $content;
}
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
  $closing_p = '</p>';
  $paragraphs = explode( $closing_p, $content );
  foreach ($paragraphs as $index => $paragraph) {
    if ( trim( $paragraph ) ) {
     $paragraphs[$index] .= $closing_p;
    }
    if ( $paragraph_id == $index + 1 ) {
     $paragraphs[$index] .= $insertion;
    }
  }
  return implode( '', $paragraphs );
}

Adding PHP: https://docs.generatepress.com/article/adding-php/

2. Add your element to a block element - hook, choose custom hook, then enter after_third_paragraph as the hook name.
https://www.screencast.com/t/DmLsa8EK

hello again, it seems that the code works but it is only shown in the blog entries, my intention is that the custom block can also be shown in the pages.... how can I do it?

Hi there,

in the above code look for this line:

if ( is_single() && ! is_admin() ) {

and change it to:

if ( ( is_single() || is_page() ) && ! is_admin() ) {

Perfect, now the block also appears on the pages.
Thank you very much.

Glad to hear that!

This archived topic is closed to new replies.