Emlog Pro获取文章封面函数修改指南

Emlog Pro 程序后,官方引入了 Markdown 编辑器。由于 Markdown 编辑器的特殊性,数据库中存储的是 Markdown 语法而非 HTML 代码,这导致之前用于获取文章封面的函数无法正常工作。为了解决这个问题,我们需要对获取文章封面的函数进行更新,使其能够兼容 Markdown 语法。

以下是修改后的函数及调用方法,该函数能够智能地获取文章封面,具体逻辑如下:

  1. 如果文章设置了封面,则直接读取 cover 参数。
  2. 如果没有设置封面,则从正文内容中获取第一张图片作为封面。
  3. 如果前两者都没有,则返回一个随机封面。

修改步骤

1. 在模板的 module.php 文件中添加以下函数

<?php

/**
 * 获取指定文章的封面图
 *
 * @param int $gid 文章ID
 * @return string 封面图片地址
 */
function getBlogCover($gid = null) {
    // 缺省默认图,请根据实际情况更改地址
    $imgUrl = TEMPLATE_URL . 'static/img/random/' . rand(0, 9) . '.jpg';

    if (!empty($gid)) {
        $db = Database::getInstance();
        $sql = "SELECT content, cover FROM " . DB_PREFIX . "blog WHERE gid='$gid'";
        $data = $db->once_fetch_array($sql);

        if (!empty($data['cover'])) {
            $imgUrl = ltrim($data['cover'], '.');
        } else {
            // Markdown 图片语法匹配正则表达式
            $regExp_md = '|!\[(.*)\]\((.+)\)|i';
            // HTML 图片标签匹配正则表达式
            $regExp_html = '|<img[^>]+src=\"([^>\"]+)\"?[^>]*>|is';

            preg_match($regExp_md, $data['content'], $mdMatches);
            preg_match($regExp_html, $data['content'], $htmlMatches);

            if (isset($mdMatches[2]) && isset($htmlMatches[1])) {
                $mdPosition = strpos($data['content'], $mdMatches[2]);
                $htmlPosition = strpos($data['content'], $htmlMatches[1]);
                // 优先使用 Markdown 语法中的图片
                if ($mdPosition < $htmlPosition) {
                    $imgUrl = $mdMatches[2];
                } else {
                    $imgUrl = $htmlMatches[1];
                }
            } elseif (isset($mdMatches[2])) {
                $imgUrl = $mdMatches[2];
            } elseif (isset($htmlMatches[1])) {
                $imgUrl = $htmlMatches[1];
            }        }
    }

    return $imgUrl;}

?>

2. 在需要显示封面的位置添加以下调用代码:

<img src="<?php echo getBlogCover($value['logid']); ?>" alt="Article Cover">

说明

  • 默认封面:函数开始时定义了一个默认封面图片的 URL,如果文章没有设置封面且正文内容中也没有图片,则会使用这个默认封面。
  • 正则表达式:使用正则表达式分别匹配 Markdown 语法中的图片和 HTML 标签中的图片。
  • 优先级:如果文章中同时包含 Markdown 语法的图片和 HTML 标签的图片,函数会优先使用 Markdown 语法中的图片作为封面。
  • 调用方式:在需要显示封面的位置,使用 getBlogCover 函数并传入文章的 ID(通常是通过循环中的 $value['logid'] 获取)。

通过以上修改,你的 Emlog Pro 模板将能够智能地获取并显示文章的封面图片,无论是通过 Markdown 编辑器还是传统的 HTML 方式添加的图片。