添加自定义标签到 Gutenberg 最新文章块

huangapple go评论61阅读模式
英文:

Add Custom Labels to gutenberg latest posts block

问题

我有一个页面,通过 Gutenberg 的块来显示特定类别的最新帖子。现在我想在帖子图像的左上角添加“新”标签。我在 wp-includes/blocks/latest-posts.php 文件中找到了这个块的代码,并在其中添加了一个自定义挂钩:

add_action('da_custom_labels', 'render_block_core_latest_posts');

之后,我在我的 functions.php 中编写了用于这个挂钩的函数:

add_filter('da_custom_labels', 'da_custom_labels_sales_posts');
function da_custom_labels_sales_posts() {
    echo get_post_meta(get_the_ID(), 'new_real_estate', true); //自定义字段
}

我尝试了许多不同的方法,但所有标签都显示在一行上,就像这样:

NewNewNewNewNewNew
<ul>
  <li> ... </li>
  <li> ... </li>
  <li> ... </li>
  <li> ... </li>
</ul>

因此,我希望将“新”标签放在每个 li 中,而不是像这样,这样我就可以应用 CSS 和其他必要的样式。

有什么想法如何实现这一点?或者是否有其他解决方法?

提前感谢。

英文:

I have a page that displays latest posts from specific category via gutenberg's block. Now I would like to add "New" label at the top left corner on the posts' images. I found inside

wp-includes/blocks/latest-posts.php

the code for this block and add a custom hook inside of it

add_action( &#39;da_custom_labels&#39;, &#39;render_block_core_latest_posts&#39; );

After that, I wrote inside my functions.php the function for the hook:

add_filter(&#39;da_custom_labels&#39;,&#39;da_custom_labels_sales_posts&#39;);
function da_custom_labels_sales_posts() {
    echo get_post_meta( get_the_ID(), &#39;new_real_estate&#39;, true ); //custom field
}

I tried many different things, but all the labels appear at one row.. Sothing like this:

NewNewNewNewNewNew
&lt;ul&gt;
  &lt;li&gt; ... &lt;/li&gt;
  &lt;li&gt; ... &lt;/li&gt;
  &lt;li&gt; ... &lt;/li&gt;
  &lt;li&gt; ... &lt;/li&gt;
&lt;/ul&gt;

Thus, I would like to have the "New" label inside every li and not like that, so I could apply CSS and anything else necessary.

Any ideas how I could accomplise that? Or any other work arround - solution?

thanks in advance

答案1

得分: 1

经过一些研究,我无法找到任何适当的挂钩或过滤器,以添加自定义功能。因此,最好的方法是通过覆盖块本身来实现。在child themefunctions.php文件中,我添加了以下代码:

add_filter( 'register_block_type_args', 'core_latest_posts_block_type_args', 10, 3 );
function core_latest_posts_block_type_args( $args, $name ) {
    if ( $name == 'core/latest-posts' ) {
        $args['render_callback'] = 'modify_core_latest_posts'; //调用自定义 Gutenberg 块
    }
    return $args;
}

function modify_core_latest_posts($attributes) { //将块复制并粘贴如下,但还添加了自定义代码
    global $post, $block_core_latest_posts_excerpt_length;

    $args = array(
        'posts_per_page'      => $attributes['postsToShow'],
        'post_status'         => 'publish',
        'order'               => $attributes['order'],
        'orderby'             => $attributes['orderBy'],
        'ignore_sticky_posts' => true,
        'no_found_rows'       => true,
    );

    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];

    if ( isset( $attributes['categories'] ) ) {
        $args['category__in'] = array_column( $attributes['categories'], 'id' );
    }
    if ( isset( $attributes['selectedAuthor'] ) ) {
        $args['author'] = $attributes['selectedAuthor'];
    }

    $query        = new WP_Query;
    $recent_posts = $query->query( $args );

    if ( isset( $attributes['displayFeaturedImage'] ) && $attributes['displayFeaturedImage'] ) {
        update_post_thumbnail_cache( $query );
    }

    $list_items_markup = '';

    foreach ( $recent_posts as $post ) {
        $post_link = esc_url( get_permalink( $post ) );
        $title     = get_the_title( $post );

        if ( ! $title ) {
            $title = __( '(no title)' );
        }

        $list_items_markup .= '<li>';

        $real_new = get_post_meta(get_the_ID(), 'real_new'); //获取自定义字段 - 自定义代码添加图像上的标签
        if($real_new) {
            if ($real_new[0]) {
                $list_items_markup .= "<span style='position:relative;top:0;left:0;z-index:99;'>" . $real_new[0] . "</span>";
            }
        }

        if ( $attributes['displayFeaturedImage'] && has_post_thumbnail( $post ) ) {
            $image_style = '';
            if ( isset( $attributes['featuredImageSizeWidth'] ) ) {
                $image_style .= sprintf( 'max-width:%spx;', $attributes['featuredImageSizeWidth'] );
            }
            if ( isset( $attributes['featuredImageSizeHeight'] ) ) {
                $image_style .= sprintf( 'max-height:%spx;', $attributes['featuredImageSizeHeight'] );
            }

            $image_classes = 'wp-block-latest-posts__featured-image';
            if ( isset( $attributes['featuredImageAlign'] ) ) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }

            $featured_image = get_the_post_thumbnail(
                $post,
                $attributes['featuredImageSizeSlug'],
                array(
                    'style' => esc_attr( $image_style ),
                )
            );
            if ( $attributes['addLinkToFeaturedImage'] ) {
                $featured_image = sprintf(
                    '<a href="%1$s" aria-label="%2$s">%3$s</a>',
                    esc_url( $post_link ),
                    esc_attr( $title ),
                    $featured_image
                );
            }
            $list_items_markup .= sprintf(
                '<div class="%1$s">%2$s</div>',
                esc_attr( $image_classes ),
                $featured_image
            );
        }

        $list_items_markup .= sprintf(
            '<a class="wp-block-latest-posts__post-title" href="%1$s">%2$s</a>',
            esc_url( $post_link ),
            $title
        );

        if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) {
            $author_display_name = get_the_author_meta( 'display_name', $post->post_author );

            /* translators: byline. %s: current author. */
            $byline = sprintf( __( 'by %s' ), $author_display_name );

            if ( ! empty( $author_display_name ) ) {
                $list_items_markup .= sprintf(
                    '<div class="wp-block-latest-posts__post-author">%1$s</div>',
                    $byline
                );
            }
        }

        if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
            $list_items_markup .= sprintf(
                '<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>',
                esc_attr( get_the_date( 'c', $post ) ),
                get_the_date( '', $post )
            );
        }

        if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
            && isset( $attributes['displayPostContentRadio'] ) && 'excerpt' === $attributes['displayPostContentRadio'] ) {

            $trimmed_excerpt = get_the_excerpt( $post );

            if ( post_password_required( $post ) ) {
                $trimmed_excerpt = __( 'This content is password protected.' );
            }

            $list_items_markup .= sprintf(
                '<div class="wp-block-latest-posts__post-excerpt">%1$s</div>',
                $trimmed_excerpt
            );
        }

        if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
            && isset( $attributes['displayPostContentRadio'] ) && 'full_post' === $attributes['displayPostContentRadio'] ) {

            $post_content = html_entity_decode( $post->post_content, ENT_QUOTES, get_option( 'blog_charset' ) );

            if ( post_password_required( $post ) ) {
                $post_content = __( 'This content is password protected.' );
            }

            $list_items_markup .= sprintf(
                '<div class="wp-block-latest-posts__post-full-content">%1$s</div>',
                wp_kses_post( $post_content )
            );
        }

        $list_items_markup .= "</li>\n";
    }

    remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );

    $class = 'wp-block-latest-posts__list';

    if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) {
        $class .= ' is-grid';
    }

    if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) {
        $class .= ' columns-' . $attributes['columns'];
    }

    if ( isset( $attributes['displayPost

<details>
<summary>英文:</summary>

After some research, I could not find any proper hook or filter in order to add my own custom functions. Thus, best way to do this is by overwritting the block itself. Inside `functions.php` of `child theme` I have add the below code:

    add_filter( &#39;register_block_type_args&#39;, &#39;core_latest_posts_block_type_args&#39;, 10, 3 );
    function core_latest_posts_block_type_args( $args, $name ) {
        if ( $name == &#39;core/latest-posts&#39; ) {
            $args[&#39;render_callback&#39;] = &#39;modify_core_latest_posts&#39;; //call custom gutenberg block
        }
        return $args;
    }
    
    function modify_core_latest_posts($attributes) { //copy and paste the block as is, but adding custom code too
        global $post, $block_core_latest_posts_excerpt_length;
    
        $args = array(
            &#39;posts_per_page&#39;      =&gt; $attributes[&#39;postsToShow&#39;],
            &#39;post_status&#39;         =&gt; &#39;publish&#39;,
            &#39;order&#39;               =&gt; $attributes[&#39;order&#39;],
            &#39;orderby&#39;             =&gt; $attributes[&#39;orderBy&#39;],
            &#39;ignore_sticky_posts&#39; =&gt; true,
            &#39;no_found_rows&#39;       =&gt; true,
        );
    
        $block_core_latest_posts_excerpt_length = $attributes[&#39;excerptLength&#39;];
    
        if ( isset( $attributes[&#39;categories&#39;] ) ) {
            $args[&#39;category__in&#39;] = array_column( $attributes[&#39;categories&#39;], &#39;id&#39; );
        }
        if ( isset( $attributes[&#39;selectedAuthor&#39;] ) ) {
            $args[&#39;author&#39;] = $attributes[&#39;selectedAuthor&#39;];
        }
    
        $query        = new WP_Query;
        $recent_posts = $query-&gt;query( $args );
    
        if ( isset( $attributes[&#39;displayFeaturedImage&#39;] ) &amp;&amp; $attributes[&#39;displayFeaturedImage&#39;] ) {
            update_post_thumbnail_cache( $query );
        }
    
        $list_items_markup = &#39;&#39;;
    
        foreach ( $recent_posts as $post ) {
            $post_link = esc_url( get_permalink( $post ) );
            $title     = get_the_title( $post );
    
            if ( ! $title ) {
                $title = __( &#39;(no title)&#39; );
            }
    
            $list_items_markup .= &#39;&lt;li&gt;&#39;;
    
    		$real_new = get_post_meta(get_the_ID(), &#39;real_new&#39;); //get custom field - custom code adding label on images
            if($real_new) {
                if ($real_new[0]) {
                    $list_items_markup .= &quot;&lt;span style=&#39;position:relative;top:0;left:0;z-index:99;&#39;&gt;&quot; . $real_new[0] . &quot;&lt;/span&gt;&quot;;
                }
            }
    
            if ( $attributes[&#39;displayFeaturedImage&#39;] &amp;&amp; has_post_thumbnail( $post ) ) {
                $image_style = &#39;&#39;;
                if ( isset( $attributes[&#39;featuredImageSizeWidth&#39;] ) ) {
                    $image_style .= sprintf( &#39;max-width:%spx;&#39;, $attributes[&#39;featuredImageSizeWidth&#39;] );
                }
                if ( isset( $attributes[&#39;featuredImageSizeHeight&#39;] ) ) {
                    $image_style .= sprintf( &#39;max-height:%spx;&#39;, $attributes[&#39;featuredImageSizeHeight&#39;] );
                }
    
                $image_classes = &#39;wp-block-latest-posts__featured-image&#39;;
                if ( isset( $attributes[&#39;featuredImageAlign&#39;] ) ) {
                    $image_classes .= &#39; align&#39; . $attributes[&#39;featuredImageAlign&#39;];
                }
    
                $featured_image = get_the_post_thumbnail(
                    $post,
                    $attributes[&#39;featuredImageSizeSlug&#39;],
                    array(
                        &#39;style&#39; =&gt; esc_attr( $image_style ),
                    )
                );
                if ( $attributes[&#39;addLinkToFeaturedImage&#39;] ) {
                    $featured_image = sprintf(
                        &#39;&lt;a href=&quot;%1$s&quot; aria-label=&quot;%2$s&quot;&gt;%3$s&lt;/a&gt;&#39;,
                        esc_url( $post_link ),
                        esc_attr( $title ),
                        $featured_image
                    );
                }
                $list_items_markup .= sprintf(
                    &#39;&lt;div class=&quot;%1$s&quot;&gt;%2$s&lt;/div&gt;&#39;,
                    esc_attr( $image_classes ),
                    $featured_image
                );
            }
    
            $list_items_markup .= sprintf(
                &#39;&lt;a class=&quot;wp-block-latest-posts__post-title&quot; href=&quot;%1$s&quot;&gt;%2$s&lt;/a&gt;&#39;,
                esc_url( $post_link ),
                $title
            );
    
            if ( isset( $attributes[&#39;displayAuthor&#39;] ) &amp;&amp; $attributes[&#39;displayAuthor&#39;] ) {
                $author_display_name = get_the_author_meta( &#39;display_name&#39;, $post-&gt;post_author );
    
                /* translators: byline. %s: current author. */
                $byline = sprintf( __( &#39;by %s&#39; ), $author_display_name );
    
                if ( ! empty( $author_display_name ) ) {
                    $list_items_markup .= sprintf(
                        &#39;&lt;div class=&quot;wp-block-latest-posts__post-author&quot;&gt;%1$s&lt;/div&gt;&#39;,
                        $byline
                    );
                }
            }
    
            if ( isset( $attributes[&#39;displayPostDate&#39;] ) &amp;&amp; $attributes[&#39;displayPostDate&#39;] ) {
                $list_items_markup .= sprintf(
                    &#39;&lt;time datetime=&quot;%1$s&quot; class=&quot;wp-block-latest-posts__post-date&quot;&gt;%2$s&lt;/time&gt;&#39;,
                    esc_attr( get_the_date( &#39;c&#39;, $post ) ),
                    get_the_date( &#39;&#39;, $post )
                );
            }
    
            if ( isset( $attributes[&#39;displayPostContent&#39;] ) &amp;&amp; $attributes[&#39;displayPostContent&#39;]
                &amp;&amp; isset( $attributes[&#39;displayPostContentRadio&#39;] ) &amp;&amp; &#39;excerpt&#39; === $attributes[&#39;displayPostContentRadio&#39;] ) {
    
                $trimmed_excerpt = get_the_excerpt( $post );
    
                if ( post_password_required( $post ) ) {
                    $trimmed_excerpt = __( &#39;This content is password protected.&#39; );
                }
    
                $list_items_markup .= sprintf(
                    &#39;&lt;div class=&quot;wp-block-latest-posts__post-excerpt&quot;&gt;%1$s&lt;/div&gt;&#39;,
                    $trimmed_excerpt
                );
            }
    
            if ( isset( $attributes[&#39;displayPostContent&#39;] ) &amp;&amp; $attributes[&#39;displayPostContent&#39;]
                &amp;&amp; isset( $attributes[&#39;displayPostContentRadio&#39;] ) &amp;&amp; &#39;full_post&#39; === $attributes[&#39;displayPostContentRadio&#39;] ) {
    
                $post_content = html_entity_decode( $post-&gt;post_content, ENT_QUOTES, get_option( &#39;blog_charset&#39; ) );
    
                if ( post_password_required( $post ) ) {
                    $post_content = __( &#39;This content is password protected.&#39; );
                }
    
                $list_items_markup .= sprintf(
                    &#39;&lt;div class=&quot;wp-block-latest-posts__post-full-content&quot;&gt;%1$s&lt;/div&gt;&#39;,
                    wp_kses_post( $post_content )
                );
            }
    
            $list_items_markup .= &quot;&lt;/li&gt;\n&quot;;
        }
    
        remove_filter( &#39;excerpt_length&#39;, &#39;block_core_latest_posts_get_excerpt_length&#39;, 20 );
    
        $class = &#39;wp-block-latest-posts__list&#39;;
    
        if ( isset( $attributes[&#39;postLayout&#39;] ) &amp;&amp; &#39;grid&#39; === $attributes[&#39;postLayout&#39;] ) {
            $class .= &#39; is-grid&#39;;
        }
    
        if ( isset( $attributes[&#39;columns&#39;] ) &amp;&amp; &#39;grid&#39; === $attributes[&#39;postLayout&#39;] ) {
            $class .= &#39; columns-&#39; . $attributes[&#39;columns&#39;];
        }
    
        if ( isset( $attributes[&#39;displayPostDate&#39;] ) &amp;&amp; $attributes[&#39;displayPostDate&#39;] ) {
            $class .= &#39; has-dates&#39;;
        }
    
        if ( isset( $attributes[&#39;displayAuthor&#39;] ) &amp;&amp; $attributes[&#39;displayAuthor&#39;] ) {
            $class .= &#39; has-author&#39;;
        }
    
        $wrapper_attributes = get_block_wrapper_attributes( array( &#39;class&#39; =&gt; $class ) );
    
        return sprintf(
            &#39;&lt;ul %1$s&gt;%2$s&lt;/ul&gt;&#39;,
            $wrapper_attributes,
            $list_items_markup
        );
    }

of course, it could be done via a custom plugin for better managing and organizing your files. Hope that helps

</details>



# 答案2
**得分**: 1

一个很好的替代方案是查询循环块(请参阅https://wordpress.org/documentation/article/query-loop-block/)。它被称为“更复杂和功能强大的最新文章块”。

使用查询循环块,您可以自定义在查询块中使用的帖子模板。

我认为通过这种方式,您至少可以使用短代码将代码添加到最新的帖子中。

祝好运 :)

<details>
<summary>英文:</summary>

a good Alternative is the Query Loop Block (see https://wordpress.org/documentation/article/query-loop-block/). It is called a &quot;a more complex and powerful Latest Posts Block&quot;.

With the Query Loop Block you can customize the post template which is used within the query block.

I think in this way you can add code to your latest posts at least with shortcodes.

Good look :)

</details>



huangapple
  • 本文由 发表于 2023年3月7日 06:23:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/75656390.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定