私は投稿に複数のショートコードがあります。
[section title="first"]
[section title="second"]
[section title="third"]
外部関数からすべての title の値(つまり、 first、second、third )を抽出したいのです。
$pattern = get_shortcode_regex();
preg_match('/'.$pattern.'/s', $post->post_content, $matches);
if (is_array($matches) && $matches[2] == 'section') {
$attribureStr = str_replace (" ", "&", trim ($matches[3]));
$attribureStr = str_replace ('"', '', $attributeStr);
$attributes = wp_parse_args ($attributeStr);
echo $attributes["title"];
}
問題は、コードが最初のショートコードからのみ値を抽出することです。投稿内のすべてのショートコードに対して機能させるにはどうすればいいですか?
利用可能であれば、私は使用します:
shortcode_atts_{$shortcode}
特定のショートコードの属性を収集するためのフィルタ。
例:
$text = '
[gallery]
[gallery ids="1,2" link="file"]
[gallery ids="3"]
[caption id="attachment_6" align="alignright" width="300"]
';
if( class_exists( 'WPSE_CollectShortcodeAttributes' ) )
{
$o = new WPSE_CollectShortcodeAttributes;
$out = $o->init( $shortcode = 'gallery', $text )->get_attributes();
print_r( $out );
}
ヘルパークラスは次のように定義されています。
class WPSE_CollectShortcodeAttributes
{
private $text = '';
private $shortcode = '';
private $atts = array();
public function init( $shortcode = '', $text = '' )
{
$this->shortcode = esc_attr( $shortcode );
if( shortcode_exists( $this->shortcode )
&& has_shortcode( $text, $this->shortcode )
)
{
add_filter( "shortcode_atts_{$this->shortcode}",
array( $this, 'collect' ), 10, 3 );
$this->text = do_shortcode( $text );
remove_filter( "shortcode_atts_{$this->shortcode}",
array( $this, 'collect' ), 10 );
}
return $this;
}
public function collect( $out, $pair, $atts )
{
$this->atts[] = $atts;
return $out;
}
public function get_attributes()
{
return $this->atts;
}
}
この例の出力は次のとおりです。
Array
(
[0] => Array
(
[0] =>
)
[1] => Array
(
[ids] => 1,2
[link] => file
[orderby] => post__in
[include] => 1,2
)
[2] => Array
(
[ids] => 3
[orderby] => post__in
[include] => 3
)
)
そのため、gallery
というショートコードの場合は、追加の属性も取得します。
しかし、すべてのショートコードが上記のフィルタをサポートしているわけではありません。その場合は、次のことを試すことができます。
/**
* Grab all attributes for a given shortcode in a text
*
* @uses get_shortcode_regex()
* @uses shortcode_parse_atts()
* @param string $tag Shortcode tag
* @param string $text Text containing shortcodes
* @return array $out Array of attributes
*/
function wpse172275_get_all_attributes( $tag, $text )
{
preg_match_all( '/' . get_shortcode_regex() . '/s', $text, $matches );
$out = array();
if( isset( $matches[2] ) )
{
foreach( (array) $matches[2] as $key => $value )
{
if( $tag === $value )
$out[] = shortcode_parse_atts( $matches[3][$key] );
}
}
return $out;
}
例:
$text = '
[gallery]
[gallery ids="1,2" link="file"]
[gallery ids="3"]
[caption id="attachment_6" align="alignright" width="300"][/caption]
';
$out = wpse172275_get_all_attributes( 'gallery', $text );
print_r( $out );
出力では:
Array
(
[0] =>
[1] => Array
(
[ids] => 1,2
[link] => file
)
[2] => Array
(
[ids] => 3
)
)
私はあなたがこれをあなたのニーズに合うように修正できることを望みます。