列出所有包含短代码的页面(WordPress)

4
我正在编写一个WordPress插件,用于创建短代码。在该插件的设置页面上,我想列出使用该短代码的所有页面。(为了方便访问和查找以进行快速更改。)
我觉得可以使用get_post(),其中它搜索所有与过滤器匹配的帖子,然后列出它们,但我似乎无法弄清楚语法是什么,或者是否可能。
有什么建议吗?

虽然您可以放置一个钩子来通知您何时调用/解析您的短代码,但这仍然依赖于每个页面被加载。您肯定需要进行DB查询。您可以使用get_posts,循环遍历所有帖子,然后在适当的字段(内容、自定义元框等)上使用strpos。 或者,您可以直接查询DB:SELECT * FROM wp_postmetaWHEREmeta_value LIKE '%[hello]%' LIMIT 0,1000; 这将为您提供包括post_ids在内的结果集。 - baku
循环遍历所有帖子并不是一个好主意。只需在帖子保存/更新时挂钩并检查此帖子是否使用了您的短代码。如果使用-将帖子ID放入新的自定义表中,然后只需从您的自定义表中获取所有记录即可。 - amedv
我不同意,这要求所有帖子至少加载一次才能进行注册。即当您首次安装并激活插件时,该列表将是不完整的。您可以通过仅在插件安装时执行查询/循环(然后将这些记录添加到自定义表中,如amedv所建议的),或者将该查询包装在暂存缓存中,以最小化不必要的查询。 - baku
正在使用查询语句 SELECT * FROM wp_posts WHERE post_content LIKE '%[mod-%' AND post_status = 'publish' LIMIT 0,1000 来实现一个系统,这是基于 @baku 的评论。将会发布结果。 - Riley Magnuson
2个回答

5

在 WordPress 论坛的帮助下,我找到了解决方法。

成功地按照以下方式完成:

global $wpdb;
$query = "SELECT ID, post_title, guid FROM ".$wpdb->posts." WHERE post_content LIKE '%[mod-%' AND post_status = 'publish'";
$results = $wpdb->get_results ($query);

然后像这样显示:

<?php foreach ( $results as $results ) { ?><p><a>ID;?>"><?php echo $results->post_title;?></a><br></p><?php } ?>

这将列出所有包含“[mod-]”的页面,并提供链接。

0
我已经将它放在一个方便的短代码中 :)
请注意:这仅过滤一些帖子状态。
add_shortcode('find_posts_with_shortcode', function ($atts = []) {
    $atts = wp_parse_args($atts, [
        'tag' => false,
    ]);

    if (!$atts['tag']) {
        return __('"tag" parameter is required');
    }

    $tag = trim($atts['tag']);

    // Adapted from shortcodes.php#add_shortcode
    if (0 !== preg_match('@[<>&/\[\]\x00-\x20=]@', $tag)) {
        /* translators: 1: Shortcode name, 2: Space-separated list of reserved characters. */
        return sprintf(__('Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s'), $tag, '& / < > [ ] =');
    }

    global $wpdb;
    $query = $wpdb->prepare(
         "SELECT id, post_title, post_status
                 FROM  $wpdb->posts
                 WHERE (post_content LIKE %s OR post_content LIKE %s)
                 AND post_status IN ('publish', 'private', 'draft') 
                 ORDER BY post_title",
        '%[' . $wpdb->esc_like($tag) . ' %', // i.e. [tag param..]
        '%[' . $wpdb->esc_like($tag) . ']%' // i.e. [tag]
    );

    $shortcode_usages = $wpdb->get_results($query);
    if (count($shortcode_usages) == 0) {
        return __('No usage found');
    }

    ob_start();
    foreach ($shortcode_usages as $post) {
        echo '<a href="' . get_permalink($post->id) . '">' . $post->post_title . ' (' . $post->post_status . ')</a><br />';
    }
    return ob_get_clean();
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接