Convert code - not work

时间:2021-06-07 作者:UserUser-name

有一个代码。

add_filter( \'the_content\', \'adding_image_dimensions\' );

function adding_image_dimensions( $content ) {

    preg_match_all( \'/<img[^>]+>/i\', $content, $images);

    if (count($images) < 1)
        return $content;

foreach ($images[0] as $image) {
    preg_match_all( \'/(alt|title|src|width|class|id|height)=("[^"]*")/i\', $image, $img );

    if ( !in_array( \'src\', $img[1] ) )
        continue;

    if ( !in_array( \'width\', $img[1] ) || !in_array( \'height\', $img[1] ) ) {
        $src = $img[2][ array_search(\'src\', $img[1]) ];
        $alt = in_array( \'alt\', $img[1] ) ? \' alt=\' . $img[2][ array_search(\'alt\', $img[1]) ] : \'\';
        $title = in_array( \'title\', $img[1] ) ? \' title=\' . $img[2][ array_search(\'title\', $img[1]) ] : \'\';
        $class = in_array( \'class\', $img[1] ) ? \' class=\' . $img[2][ array_search(\'class\', $img[1]) ] : \'\';
        $id = in_array( \'id\', $img[1] ) ? \' id=\' . $img[2][ array_search(\'id\', $img[1]) ] : \'\';

        list( $width, $height, $type, $attr ) = getimagesize( str_replace( "\\"", "" , $src ) );
        $html = \'\';

        if (($width != 0) || ($height != 0)) {
            $html = \' width="%d" height="%d" \';
        }

        $image_tag = sprintf( \'<img loading="lazy" src=%s%s%s%s%s\' . $html . \'/>\', $src, $alt, $title, $class, $id, $width, $height );
        $content = str_replace($image, $image_tag, $content);
    }
}

return $content;
}
我把它改了一点。因此,所有内容都可以立即放入数据库,而不是不断地动态生成。

add_action( \'wp_insert_post_data\', \'adding_image_dimensions\' );

function adding_image_dimensions( $content ) {

$content = $content[\'post_content\'];

    preg_match_all( \'/<img[^>]+>/i\', $content, $images);

    if (count($images) < 1)
        return $content;

foreach ($images[0] as $image) {...
但由于某些原因,代码不起作用:-(

Im使用WordPress 5.7.2,经典编辑器。在我的文章中,我有很多这样题写的图片。

<a href="https://....jpg" target="_blank" rel="nofollow" title="test title"><img class="test class" alt="test alt" src="https://....jpg"></a>
对不起,我的英语不好。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我把它改了一点。

但由于某些原因,代码不起作用:-(

你应该解释到底发生了什么或没有发生什么,而不是简单地说;不起作用;。

但无论如何,如果下面的第一行和第五行是您在代码中应用的唯一更改:

add_action( \'wp_insert_post_data\', \'adding_image_dimensions\' );

function adding_image_dimensions( $content ) {

$content = $content[\'post_content\'];
那么这确实不会给您带来预期的结果(例如,否<img> 标签将被替换,因为第二个preg_match_all() 调用将失败),原因如下:

该函数现在连接到wp_insert_post_data filter, 因此,函数应该返回post数据数组,但在代码中,第五行(即。$content = $content[\'post_content\'];) 实际上,将返回值更改为字符串。

$content[\'post_content\'] 值被删除(例如。src="..." 成为src=\\"...\\"), 因此,您应该首先取消斜杠值,然后在处理图像标记后将其向后斜杠。

如何解决这些问题,使adding_image_dimensions() 函数与wp_insert_post_data 相反,您可以尝试以下操作:

// 1: Rename the $content to $data
function adding_image_dimensions( $data ) {
    // 2: Unslash the post content.
    $content = wp_unslash( $data[\'post_content\'] );

    preg_match_all( \'/<img[^>]+>/i\', $content, $images);

    if (count($images) < 1) {
        // 3: Return the $data and not $content.
        return $data;
    }

    foreach ($images[0] as $image) {
        // ... your code here.
    }

    // 4: Slash back the post content.
    $data[\'post_content\'] = wp_slash( $content );

    // 5: Return the $data and not $content.
    return $data;
}

替代解决方案(无需“转换”或修改自定义函数)

删除add_filter( \'the_content\', \'adding_image_dimensions\' );

调用原始文件adding_image_dimensions() 中的函数wp_insert_post_data 挂钩:

// * use add_filter() and not add_action()
add_filter( \'wp_insert_post_data\', \'my_wp_insert_post_data\' );

function my_wp_insert_post_data( $data ) {
    $content = adding_image_dimensions( wp_unslash( $data[\'post_content\'] ) ); // pass an *unslashed* content
    $data[\'post_content\'] = wp_slash( $content ); // then slash back the content
    return $data;
}

相关推荐

同时发布多个帖子时未重新生成PHP变量

上下文:我正在构建一个自动化系统,该系统将从数据库中获取记录,并立即将其作为CPT整体发布。当它们被发布时,我在函数中有一个函数。一个子主题的php文件,应该自动为帖子设置两个类别,a“;“固定”;一个是“人”,另一个是基于一列(categ),这是随邮件发送的记录的一部分。我的问题是,第二个类别(应该根据记录的内容进行更改)被永久设置为所有正在处理的第一个职位。有没有办法修改下面的代码,以便更好地指定它应该返回在该特定记录中找到的类别?使用“save\\u post”挂钩同时发布多篇文章是否可能有问题?C