您是否正在寻找一种为特定WordPress类别设置默认帖子缩略图的方法?

如果您有没有特色图像的文章,或者如果您希望一个类别中的所有帖子都有类似的缩略图,那么您可以为每个类别设置一个回退图像,这样就不会遗漏任何博客文章。

在本文中,我们将向您展示如何在WordPress中为特定类别设置默认的回退特色图像

为什么要为帖子类别添加回退特色图像

假设你有一个WordPress博客,你为每个帖子分配一个类别。如果出于某种原因没有特色图像,您可以分配该类别中的所有帖子以显示相同的回退图像。

为帖子类别添加回退图像的另一个好处是,如果您的类别存档页面获得大量搜索流量,那么它们会更吸引人,更具吸引力。

也就是说,让我们看看如何使用WordPress插件和自定义代码根据帖子类别添加回退图像。

使用插件在WordPress中设置回退特色图像

默认情况下,WordPress不提供将图像添加到帖子类别页面的选项。但是,您可以使用WordPress插件轻松为帖子类别设置回退图像。

首先,您需要安装并激活类别和分类图像插件。有关更多详细信息,请参阅我们关于如何安装WordPress插件的指南。

激活后,您可以从WordPress管理面板前往设置»分类图像。接下来,您可以单击“类别”复选框,将分类图像包含在您的帖子类别中作为回退。

为类别启用分类图像

完成后,不要忘记单击“保存更改”按钮。

之后,您可以从WordPress仪表板转到帖子?类别。当添加新类别或编辑现有类别时,您将看到一个“图像”字段。

类别的新图像字段

只需输入要添加到WordPress类别的图像URL。有关更多详细信息,请参阅我们的指南,了解如何获取您在WordPress中上传的图像的URL

现在,当您发布没有分配特色图像的博客文章时,WordPress将使用您刚刚为类别设置的图片。

这是我们在您的演示网站上使用的图像的预览。

使用插件预览回退图像

仅此而已!您现在已根据帖子类别成功添加了回退图像。

在没有插件的情况下在WordPress中设置回退特色图像

您还可以在不使用WordPress插件的情况下为帖子类别配置回退图像。然而,这种方法不建议初学者使用,因为它涉及代码片段。

您需要做的第一件事是为您的WordPress类别创建图像。使用类别slug作为图像文件名,并将它们全部保存为相同的格式,如JPG或PNG。

接下来,您可以从Media?Add New将类别图像上传到WordPress网站。

将图像上传到媒体库

WordPress将在上传期间存储您的类别图像,并创建由您的主题定义的图像大小。

上传类别图像后,您需要将它们移动到不同的目录。只需使用FTP客户端连接到您的网站,然后转到/wp-content/uploads/文件夹。

在WordPress中上传文件夹

您上传的类别图像将存储在月份文件夹中,如/uploads/2022/08/

继续打开本月的文件夹。

媒体上传按年和月度文件夹组织

有关更多信息,请参阅我们关于WordPress在您的网站上存储图像的指南

接下来,在计算机桌面上创建一个文件夹,并将其命名为类别图像。现在将您的所有类别图像和WordPress为它们制作的所有尺寸下载到桌面上的这个新文件夹中。

下载完成后,您需要将类别图像文件夹上传到/wp-content/uploads目录。这样做将允许您将所有类别图像大小放在一个单独的文件夹中,该文件夹很容易调用您的主题。

有关更多详细信息,请参阅我们关于如何使用FTP将文件上传到WordPress的指南。

将类别图像显示为默认回退特色图像

接下来,当类别中的帖子没有一组时,我们将向您展示如何将其中一个图像显示为回退特色图像。

这种方法确实涉及复制和粘贴代码,我们通常不建议用户编辑他们的主题文件。小错误可能会在您的网站上犯大错误。

向网站添加代码的一个更简单的方法是使用WPCode。这是最好的WordPress代码片段插件,允许您管理网站上的自定义代码。

首先,您需要安装并激活免费的WPCode插件。有关更多详细信息,请参阅我们关于如何安装WordPress插件的指南。

接下来,您可以转到代码片段?+在WordPress管理面板中添加片段以添加新片段。然后只需单击“添加新”按钮。

在WPCode中单击“添加新片段”

之后,您可以添加自定义代码或使用WPCode库中的片段。

为此,您将使用自己的自定义代码,因此将鼠标悬停在“添加自定义代码(新片段)”选项上,然后单击“使用片段”选项。

在WPCode中添加自定义代码

现在为您的片段添加一个名称,并在“代码预览”部分输入代码。

由于代码有PHP,请确保选择“代码类型”作为PHP片段。

添加回退图像

只需复制以下代码片段并将其粘贴到“代码预览”字段中。

/**
 * Plugin Name: Category Thumbnail Fallback
 * Description: Use the category image as fallback when the post does not have a featured image
 */

class WPBCategoryThumbnailFallback
{
    protected static $taxonomies = ['category'];

    protected $nonceId = 'wpb_category_thumb_fallback_none';
    protected $fieldId = 'wpb_category_fallback_post_image';

    public $taxonomy;

    protected function __construct($taxonomy)
    {
        $this->taxonomy = $taxonomy;
    }

    public static function init()
    {
        foreach (static::$taxonomies as $taxonomy) {
            $_self = new self($taxonomy);

            add_action('admin_enqueue_scripts', [$_self, 'scripts']);

            add_action("{$taxonomy}_add_form_fields", [$_self, 'add']);
            add_action("{$taxonomy}_edit_form_fields", [$_self, 'edit'], 99, 2);

            add_action("created_{$taxonomy}", [$_self, 'saveTerm'], 10, 2);
            add_action("edited_{$taxonomy}", [$_self, 'editTerm'], 10, 2);

            add_filter("get_post_metadata", [$_self, 'fallback'], 99, 5);
        }
    }

    public function scripts($hook_suffix)
    {
        if (in_array($hook_suffix, ['term.php', 'edit-tags.php'])) {
            $screen = get_current_screen();

            if (is_object($screen) && "edit-{$this->taxonomy}" == $screen->id) {
                wp_enqueue_media();

                wp_add_inline_script('media-editor', $this->inlineScript());
            }
        }
    }

    public function add()
    {
        ?>
        <div class="form-field upload_image-wrap">
            <label for="upload_image">Image</label>
            <input id="upload_image" type="hidden" size="36" name="<?php
            echo esc_attr($this->fieldId)
            ?>" value=""/>
            <div id="wpb-category-image-preview" style="max-width: 150px; max-height: 150px;"></div>
            <input id="upload_image_button" class="button" type="button" value="Upload Image"/>
            <p>Enter a URL or upload an image</p>
        </div>
        <?php
        wp_nonce_field($this->nonceId, $this->nonceId);
    }

    public function edit($term, $taxonomy)
    {
        $value = get_term_meta($term->term_id, $this->fieldId, true);
        $image = wp_get_attachment_image((int)$value);
        ?>
        <tr class="form-field upload_image-wrap">
            <th scope="row"><label for="name">Image</label></th>
            <td>
                <label for="upload_image">
                    <input id="upload_image" type="hidden" size="36" name="<?php
                    echo esc_attr($this->fieldId)
                    ?>" value="<?php
                    echo esc_attr($value)
                    ?>"/>
                    <div id="wpb-category-image-preview" style="max-width: 150px; max-height: 150px;"><?php
                        echo $image;
                        ?></div>
                    <input id="upload_image_button" class="button" type="button" value="Upload Image"/>
                </label>
                <p class="description">Enter a URL or upload an image</p>
            </td>
        </tr>
        <?php
        wp_nonce_field($this->nonceId, $this->nonceId);
    }

    public function saveTerm($term_id, $tt_id)
    {
        $data = array_filter(wp_unslash($_POST), function ($value, $key) {
            return in_array($key, [$this->nonceId, $this->fieldId]);
        }, ARRAY_FILTER_USE_BOTH);

        if (
            empty($data) ||
            empty($data[$this->nonceId]) ||
            ! wp_verify_nonce($data[$this->nonceId], $this->nonceId) ||
            ! current_user_can('manage_categories')
        ) {
            return null;
        }

        if (empty($data[$this->fieldId]) || empty(absint($data[$this->fieldId]))) {
            return delete_term_meta($term_id, $this->fieldId);
        }

        $value = absint($data[$this->fieldId]);

        return update_term_meta($term_id, $this->fieldId, $value);
    }

    public function editTerm($term_id, $tt_id)
    {
        $this->saveTerm($term_id, $tt_id);
    }

    public function fallback($null, $object_id, $meta_key, $single, $meta_type)
    {
        if (
            $null === null &&
            $meta_key === '_thumbnail_id'
        ) {
            $meta_cache = wp_cache_get($object_id, $meta_type . '_meta');

            if ( ! $meta_cache) {
                $meta_cache = update_meta_cache($meta_type, [$object_id]);
                $meta_cache = $meta_cache[$object_id] ?? null;
            }

            $val = null;

            if (isset($meta_cache[$meta_key])) {
                if ($single) {
                    $val = maybe_unserialize($meta_cache[$meta_key][0]);
                } else {
                    $val = array_map('maybe_unserialize', $meta_cache[$meta_key]);
                }
            }

            if (empty($val)) {
                $fallbackImageId = $this->getPostFallbackImageId($object_id, $single);

                if ( ! empty($fallbackImageId)) {
                    return $fallbackImageId;
                }
            }

            return $val;
        }

        return $null;
    }

    public function getPostFallbackImageId($postId, $single)
    {
        $terms = get_the_terms($postId, $this->taxonomy);

        if (empty($terms) || is_wp_error($terms)) {
            return null;
        }

        foreach ($terms as $term) {
            $fallbackIdFromCategoryId = get_term_meta($term->term_id, $this->fieldId, $single);

            if ( ! empty($fallbackIdFromCategoryId)) {
                return $fallbackIdFromCategoryId;
            }
        }

        return null;
    }

    public function inlineScript()
    {
        return "jQuery(document).ready(function ($) {
            var custom_uploader;
            $('#upload_image_button').click(function (e) {
                e.preventDefault();
                //If the uploader object has already been created, reopen the dialog
                if (custom_uploader) {
                    custom_uploader.open();
                    return;
                }
                //Extend the wp.media object
                custom_uploader = wp.media.frames.file_frame = wp.media({
                    title: 'Choose Image',
                    button: {
                        text: 'Choose Image'
                    },
                    multiple: true
                });
                //When a file is selected, grab the URL and set it as the text field's value
                custom_uploader.on('select', function () {
                    console.log(custom_uploader.state().get('selection').toJSON());
                    attachment = custom_uploader.state().get('selection').first().toJSON();
                     
                    var thumbUrl = attachment && attachment.sizes && attachment.sizes.thumbnail && attachment.sizes.thumbnail.url
                    ? attachment.sizes.thumbnail.url
                    : attachment.url;
                    $('#wpb-category-image-preview').html('<img src=\"'+ thumbUrl +'\">');
                    $('#upload_image').val(attachment.id);
                });
                //Open the uploader dialog
                custom_uploader.open();
            });
        });";
    }
}

 

接下来,您可以向下滚动到“插入”部分,然后选择“自动插入”,让插件为您处理放置。

然后在“位置”下拉菜单的“页面、帖子、自定义帖子类型”部分下选择“在内容之前插入”选项。

选择回退图像插入选项

然后,您可以返回页面顶部,并将切换从“不活跃”切换到“活动”。

一旦您单击顶部的“保存片段”按钮,您的回退图像将就位。

保存并激活代码片段WPCode

您可能还想查看我们关于如何在WordPress中添加自定义代码片段的指南

注意:此代码片段仅适用于“类别”分类法。但是,您可以通过在代码中将其名称添加到以下类的列表中,并将括号内的术语更改为“标签”或“帖子”来添加更多分类。

完成后,只需访问您的网站即可查看回退图像。

回退图像预览

评论被关闭。