如何使用当前帖子中的数据修改快捷码属性

时间:2017-09-13 作者:Peter Arthur

我对自己缺乏PHP/WP知识以及在解释我要找的内容时的冗长表示歉意,但我已经尝试了几天的解决方案,现在我才开始关注过滤器和循环。

Here\'s what I\'d like to accomplish:

我正在使用的插件的一个短代码有一个属性标记“sched”,我想让它本质上是动态的,改为当前(自定义)帖子的(自定义)类别slug。下面是一个与MSTW Schedules and Scoreboards插件配合良好的现有短代码示例:

[mstw_schedule_table sched="v-football"]
我的计划是将“sched”属性的值设置为“sport”(在所有帖子上),作为占位符,用当前帖子的“sport”自定义类别slug替换。我已经设置了所有“运动”类别的slug,以与插件中使用的“sched”值相对应,以确保当前帖子上显示的时间表是正确的。

注意:所有这些自定义帖子(设置为“团队”)应该只应用一个“运动”类别:我在admin中将“运动”类别设置为下拉框,如this.

另请注意:我希望自定义帖子的内容中可以使用可编辑的快捷码,这样我就可以根据需要编辑每个帖子的其他属性。

Here is what I\'ve tried:

这是我得到的最接近的结果,但我知道我使用了错误的过滤器,或者在错误的时间调用了函数。注意,在循环之前,我在为自定义post类型创建的“single team.php”文件中运行了这段代码。我知道它应该在函数中。php或单独的插件(请告知)。

我的灵感:
do_shortcode_tag / get_the_terms

    add_filter( \'do_shortcode_tag\', \'wpse_106269_do_shortcode_tag\', 10, 4);
    function wpse_106269_do_shortcode_tag( $output, $tag, $attr, $m ) {

        if( $tag === \'mstw_schedule_table\' ) {
            //* Do something useful
            if ($attr[\'sched\'] === \'sport-slug\') {
                print_r($attr);

                // Get a list of tags and extract their names
                $sport = get_the_terms( get_the_ID(), \'sport\' );
                if ( ! empty( $sport ) && ! is_wp_error( $sport ) ) {
                    $sport_slug = wp_list_pluck( $sport, \'slug\' );

                    $attr[\'sched\'] = $sport_slug[0];
                }

                echo "<br>";
                print_r($attr);
            }

        }
        return $output;
    }
这将输出:

Array ( [sched] => sport-slug ) 
Array ( [sched] => v-football )
所以我知道我可以更改短代码的$attr的值,但在插件解析之前,我不知道如何用修改后的短代码替换原来的短代码。

我试过使用the_content:

// Modify Content of a Post
add_filter(\'the_content\', \'se24265_my_function\');
function se24265_my_function( $content )
{
    $write = \'hello world\'; 
    $new_content = $write . $content;

        $sport = get_the_terms( get_the_ID(), \'sport\' );
        if ( ! empty( $sport ) && ! is_wp_error( $sport ) ) {
            $sport_slug = wp_list_pluck( $sport, \'slug\' );

            str_replace("sport-slug", $sport_slug[0], $new_content);
        }
        return $new_content; 
        // outputs hello world
        // outputs inital shortcode without modifications
}
我还考虑过运行插件的shortcode处理函数(如this) 使用修改后的参数,但我不知道如何在插件解释之前访问/修改该参数。

我也看到了this 在自定义帖子模板中生成快捷码的示例。。。

// Making your custom string parses shortcode
$string = do_shortcode( $string );
// If your string has a custom filter, add its tag name in an applicable add_filter function
add_filter( \'my_string_filter_hook_tag_name\', \'do_shortcode\' );
。。。但我希望能够根据需要在每个自定义帖子的不同位置编辑/放置短代码,而且我仍然不知道要使用哪个过滤器挂钩(content\\u edit\\u pre?)

任何帮助都将不胜感激。谢谢

2 个回复
最合适的回答,由SO网友:Peter Arthur 整理而成

对于任何可能偶然发现这一点的人,我找到了一个解决方案:

在我的特殊情况下,我使用的是单一的-[分类法]。php模板文件,并且能够通过WordPress函数手动添加短代码do_shortcode() 而不是修改帖子内容中的短代码。

我是这样写的:

<?php echo do_shortcode( \'[mstw_schedule_table sched="\'.$sports_slug.\'" ]\' ); ?>
下面是我如何让$sports\\u slug为我工作的。之前在文件中(循环外):

// Get this post\'s sport taxonomy - https://wordpress.stackexchange.com/a/168862/127459
           $sports = get_the_terms($post->ID, \'sport\');
           $sports_slug = \'\';
           if ($sports) { 

                foreach ($sports as $sport) {   
                    $sports_slug = $sport->slug;    
                }
           }
此代码比我使用的代码稍微简单一些(我只需要选择非父运动分类法),但此简化版本可能会帮助其他人。这些链接帮助了我:

Get custom category name from ID (Answer)

get_the_terms()

SO网友:Ejaz UL Haq

是的,您可以过滤和修改任何第三方插件的短代码属性,并根据更新的短代码更改短代码输出

Case Study
例如,我们有一个第三方插件的短代码usermeta 它需要一个属性user_id我们想修改user_id 属性值

The following solution is tested and working 100%.

// hook the custom callback function on the do_shortcode_tag action hook 
add_action( \'do_shortcode_tag\', \'update_shortcode_attr_and_output\', 1, 4 );


//callback function to filter and modify the usermeta shortcode attr & output
function update_shortcode_attr_and_output( $output, $tag, $attr, $m ) {

         //Filter the shortcode tag
        if (  \'usermeta\' == $tag && ! isset( $attr[\'user_id\'] ) ) {

            // Update ShortCode Attribute user_id value
            $attr[\'user_id\'] = $this->user_id;

            /**
             * update outup according updated attr
             * Refrence: https://core.trac.wordpress.org/browser/trunk/src/wp-includes/shortcodes.php?rev=38713#L342
             */
            global $shortcode_tags;
            $content = isset( $m[5] ) ? $m[5] : null;
            $output  = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];

        }

        return $output;
}

结束

相关推荐

Vue.js + AJAX Shortcode

我知道以前有人问过这个问题,但我找不到具体用例的实质性答案。Overview我一直在使用RESTAPI和Vue开发一个基于Wordpress的网站。js作为前端框架。我在获取帖子、显示数据等方面没有问题。Issue自Vue以来。js在客户端运行,我在使用需要在php中呈现服务器端的插件/短代码时遇到了一些问题。我正在寻找一种解决方案,在php函数中呈现一个短代码,并将呈现的数据发送到我的前端,最终使用Vue显示它。js。JSvar http = new XMLHttpRequest(); var