重写HAS_POST_缩略图函数

时间:2018-04-15 作者:Damir Gasparlin

有没有办法改变核心has_post_thumbnail 作用

我需要先用图像检查服务器上的文件夹,然后代码才能查找后期图像附件。

我看到很多过滤器可以更改图像html,但它们要么影响单个贴子页面,要么影响循环缩略图,还有woocommerce的几个其他位置加上管理表,等等。

我需要在服务器目录命中之前进行检查_post_thumbnail()get_image 所以看起来has_post_thumbnail 是第一次检查,除非我错了。

请帮助,建议可以做什么。

非常感谢。

编辑:尝试将if语句放入post-thumbnail-template.php has_post_thumbnail 功能,但不起作用。我在哪里可以提前检查文件夹中的图像,并且可能不编辑WordPress核心文件?

编辑:我认为这有点奏效。问题是,我需要将目录中的图像名称与另一个post meta、woocommerce产品进行匹配。

我首先检查自定义文件夹中的图像,然后检查后附件。到目前为止,我是如何在隐藏产品模板文件的过程中做到这一点的:

global $post;
$picname = get_post_meta( get_the_ID(), \'_box_upc\', true );
$file = \'/var/www/html/images/products/\' . $picname  . \'.jpg\';
if (file_exists($file)) {
$filesrc = home_url( \'/\' ).\'images/products/\' . $picname  . \'.jpg\';
//show the image
$result = \'<img src="\' . $filesrc. \'" class="attachment-shop_thumbnail size-shop_thumbnail wp-post-image" alt="" title="">\';
}else{
//return post attachment if exists code
}
使用@krzysiek dródżcode这就是我所拥有的,但似乎我无法使用全局$post获得其他帖子元来匹配文件名,也无法获得帖子标题,它会导致服务器错误:

function my_override_has_post_thumbnail( $result, $object_id, $meta_key, $single ) {
    global $post;
 // Get post other meta, neither one works so I uncommeneted
    //$picname = get_post_meta( $post->get_id(), \'_box_upc\', true );
    //$picname = get_post_meta( get_the_ID(), \'_box_upc\', true );
    if ( \'_thumbnail_id\' === $meta_key ) {
        // perform your checks and return some ID if thumbnail exists

     // Get image from custom folder
    $filelocation = \'/var/www/html/images/products/\' . $picname  . \'.jpg\';

    if (file_exists($filelocation)) {


    $filesrc = home_url( \'/\' ).\'images/products/\' . $picname  . \'.jpg\';

                //show the image
    $result = \'<img src="\' . $filesrc. \'" class="attachment-shop_thumbnail size-shop_thumbnail wp-post-image" alt="\'.$post->get_title().\'" title="\'.$post->get_title().\'">\';


    }
    }

    return $result;
}
add_filter( \'get_post_metadata\', \'my_override_has_post_thumbnail\', 10, 4 );

2 个回复
SO网友:Krzysiek Dróżdż

是的,有一种方法可以做到这一点。。。让我们看看has_post_thumbnail 功能本身:

function has_post_thumbnail( $post = null ) {
    return (bool) get_post_thumbnail_id( $post );
}
正如您所看到的,它真正做的只是获取帖子缩略图ID并检查它是否存在。但这里没有过滤器。让我们更深入地了解:

function get_post_thumbnail_id( $post = null ) {
    $post = get_post( $post );
    if ( ! $post ) {
        return \'\';
    }
    return get_post_meta( $post->ID, \'_thumbnail_id\', true );
}
仍然没有过滤器,但有希望:

function get_post_meta( $post_id, $key = \'\', $single = false ) {
    return get_metadata(\'post\', $post_id, $key, $single);
}
最后get_metadata...

function get_metadata($meta_type, $object_id, $meta_key = \'\', $single = false) {
    if ( ! $meta_type || ! is_numeric( $object_id ) ) {
        return false;
    }

    $object_id = absint( $object_id );
    if ( ! $object_id ) {
        return false;
    }

    /**
     * Filters whether to retrieve metadata of a specific type.
     *
     * The dynamic portion of the hook, `$meta_type`, refers to the meta
     * object type (comment, post, or user). Returning a non-null value
     * will effectively short-circuit the function.
     *
     * @since 3.1.0
     *
     * @param null|array|string $value     The value get_metadata() should return - a single metadata value,
     *                                     or an array of values.
     * @param int               $object_id Object ID.
     * @param string            $meta_key  Meta key.
     * @param bool              $single    Whether to return only the first value of the specified $meta_key.
     */
    $check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single );
    if ( null !== $check ) {
        if ( $single && is_array( $check ) )
            return $check[0];
        else
            return $check;
    }
    ...
看来我们可以用get_post_metadata 挂起以覆盖has_post_thumbnail 后果你唯一需要记住的是,它会改变get_post_thumbnail_id 而且

像这样的事情应该可以做到:

function my_override_has_post_thumbnail( $result, $object_id, $meta_key, $single ) {
    if ( \'_thumbnail_id\' === $meta_key ) {
        // perform your checks and return some ID if thumbnail exists
    }

    return $result;
}
add_filter( \'get_post_metadata\', \'my_override_has_post_thumbnail\', 10, 4 );

SO网友:Mark Kaplun

@Krzysiek Dródż对你所问的问题的回答是非常正确的,但你应该问问自己,你所问的问题是否正确。。。。

Wordpress假设数据库中正确存储了一定数量的图像相关信息,以便其API能够正确处理这些信息。不在DB中的图像是外部的,API将不适用于它们。现在,您已经确定了一个给您带来问题的API,但您的代码越复杂,或者站点上使用的第三方代码越多,您将遇到更多不适用于图像的API。

因此,正确的答案可能是首先避免这个问题,并正确地将图像导入wordpress。

结束

相关推荐

Safely editing core files

我想编辑wp评论帖子。例如,如果有人试图发布没有内容的评论,他们将得到一个弹出框,告诉他们不能发布空评论,而不是此时发生的页面重定向。if ( \'\' == $comment_content ) { wp_die( __( \'<strong>ERROR</strong>: please type a comment.\' ), 200 ); } 有人能推荐一种安全的方法来避免我的更改被将来的Wordpress升级所覆盖吗。。。