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

时间:2018-12-20 20:57:31

标签: php html wordpress

我正在为wordpress编写一个可创建简码的插件。在此插件设置页面上,我希望它列出使用短代码的页面。 (为了便于访问和查找它们以进行快速更改。)

我认为这与get_post()有关,它会搜索与过滤器匹配的所有帖子,然后列出它们,但是我似乎无法弄清楚其语法是什么,或者这是否是甚至可能。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我在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-””的页面并提供指向它们的链接。

答案 1 :(得分: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();
});