用短代码包装一个函数,然后 return 并在我的 wordpress 网站上的编辑器中回显结果

Wrap in a shortcode a function and then return and echo the result in my editor on my wordpress website

这是我的问题:

两周前,我创建了一个很好的函数,用于在 wordpress 网站的 select 元素中填充我的选项。我的目的是添加我的成员的所有姓名和他们的电子邮件作为我在类别 "Member" 下创建的一些帖子的值,因此,每当我编辑、添加或删除我网站中的任何成员时,该部分将是自动更新。

类似于:

<select>
<option value="myemail@test.com">First user</option>
<option value="myemail2@test.com">Second user</option>
<option value="myemail3@test.com">Third user</option>
</select>

为了实现我的目标,我以这种方式修改了循环:

$members = [];
$temp_query = $wp_query;
query_posts("cat=2&showposts=20");
while (have_posts()) : the_post();
$membername = get_post_meta( $post->ID, 'name', true );
$memberemail = get_post_meta( $post->ID, 'email', true );
if ( ! empty( $membername ) ) {
    $members[] = '<option value="' . $memberemail . '">' . get_post_meta($post->ID, 'name', true) .'</option>';
}
endwhile;

然后我调用 select 中的选项或类似的:

<select class="drops" name="smallsan">
    <?php echo implode($members); ?>
</select>

到目前为止一切顺利,除了我将这段代码包装在我的模板中。

我的问题是我需要 运行 一个插件以便对未订阅的人隐藏页面,所以我必须在编辑器的循环中添加 html 然后我无法在那里执行 php。

所以我尝试将代码包装在我的 function.php 中以将其与这样的短代码相关联:

function mymembershortcode() {
    $members = [];
    $temp_query = $wp_query;
    query_posts("cat=2&showposts=20");
    while (have_posts()) : the_post();
    $membername = get_post_meta( $post->ID, 'name', true );
    $memberemail = get_post_meta( $post->ID, 'email', true );
    if ( ! empty( $membername ) ) {
        $members[] = '<option value="' . $memberemail . '">' . get_post_meta($post->ID, 'name', true) .'</option>';
    }
    endwhile;
    return implode($members);
}
add_shortcode('mymemberselector', 'mymembershortcode');

到 运行 简码:

<select class="drops" name="smallsan">
    [mymemberselector]
</select>

基本上在我需要的时候,但它不起作用,我怀疑这是因为我不能同时 return 和 echo。

有谁知道我该如何解决我的问题?

试试这个:

function mymembershortcode() {
    $members = [];
    $query = new WP_Query( array(
        'cat' => 2,
        'posts_per_page' => 20,
    )); 

    while ($query->have_posts()) : $query->the_post();
        $membername = get_post_meta( get_the_ID(), 'name', true );
        $memberemail = get_post_meta( get_the_ID(), 'email', true );
        if ( ! empty( $membername ) ) {
            $members[] = '<option value="' . $memberemail . '">' . get_post_meta(get_the_ID(), 'name', true) .'</option>';
        }

    endwhile;
    wp_reset_postdata(); 
    return implode($members);

}

add_shortcode('mymemberselector', 'mymembershortcode');

这里有一些关于为什么你不应该使用 query_posts() 的信息 https://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts