it-swarm.dev

Načítání skriptů pouze v případě, že je přítomen konkrétní kód nebo widget

Potřeboval jsem způsob, jak filtrovat obsah stránky/příspěvků předtím, než byl načten, takže jsem mohl přidat skripty do záhlaví, pokud byl přítomen konkrétní kód. Po dlouhém hledání jsem narazil na toto téma http://wpengineer.com

function has_my_shortcode($posts) {
    if ( empty($posts) )
        return $posts;

    $found = false;

    foreach ($posts as $post) {
        if ( stripos($post->post_content, '[my_shortcode') )
            $found = true;
            break;
        }

    if ($found){
        $urljs = get_bloginfo( 'template_directory' ).IMP_JS;

    wp_register_script('my_script', $urljs.'myscript.js' );

    wp_print_scripts('my_script');
}
    return $posts;
}
add_action('the_posts', 'has_my_shortcode');

což je naprosto brilantní a udělal přesně to, co jsem potřeboval.

Teď musím trochu rozšířit a udělat to samé pro postranní panely. Může to být určitý typ widgetu, krátký kód, úryvek kódu nebo cokoli jiného, ​​které by bylo vhodné identifikovat při načítání skriptu.

Problém je, že nemohu přijít na to, jak přistupovat k obsahu sidebars před načtením postranního panelu (příslušné téma bude mít několik postranních panelů)

16
Ashley G

Můžete použít funkci is_active_widget . Např.:

function check_widget() {
    if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used
        wp_enqueue_script('my-script');
    }
}

add_action( 'init', 'check_widget' );

Pro načtení skriptu na stránku, na které je widget pouze načten, budete muset přidat třídu is_active_widget () do třídy widgetů. Viz např. Výchozí widget pro poslední komentáře (wp-includes/default-widgets.php, řádek 602):

class WP_Widget_Recent_Comments extends WP_Widget {

    function WP_Widget_Recent_Comments() {
        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
        $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
        $this->alt_option_name = 'widget_recent_comments';

        if ( is_active_widget(false, false, $this->id_base) )
            add_action( 'wp_head', array(&$this, 'recent_comments_style') );

        add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
        add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
    }
19
sorich87

Jen jsem se chtěl podělit o řešení, na kterém jsem pracoval, což mi umožnilo být o něco více univerzální s mou implementací. Namísto kontroly funkce pro různé zkratky jsem ji upravil tak, aby vyhledal jeden krátký kód, který odkazuje na funkci skriptu/stylu, kterou je třeba zapracovat. To bude fungovat pro obě metody v jiných třídách (např. Pluginy, které to nemusí udělat) a funkce v rozsahu. Stačí vložit níže uvedený kód do function.php a přidat následující syntaxi na libovolnou stránku/příspěvek, kde chcete konkrétní CSS & JS.

Syntaxe stránky/pošty: [loadCSSandJS function = "(třída-> název metody/funkce)"]

code.php kód:

function page_specific_CSSandJS( $posts ) {
  if ( empty( $posts ) )
    return $posts;

  foreach ($posts as $post) {

    $returnValue = preg_match_all('#\[loadCSSandJS function="([A-z\-\>]+)"\]#i', $post->post_content, $types);

    foreach($types[1] as $type) {
      $items = explode("->",$type);
      if (count($items) == 2) {
        global $$items[0];      
        if( method_exists( $$items[0], $items[1] ))
          add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) );
      }
      else if( !empty( $type ) && function_exists( $type ))
        add_action( 'wp_enqueue_scripts', $type );
    }
  }

  return $posts;
}

To vám také umožní přidat na stránku tolik, kolik chcete. Mějte na paměti, že pro načtení potřebujete metodu/funkci.

3
Nick Caporin

s Wordpressem 4.7 existuje jiný způsob, jak toho dosáhnout v souboru functions.php,

add_action( 'wp_enqueue_scripts', 'register_my_script');
function register_my_script(){
  wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter);
}

nejprve si zaregistrujete svůj skript , který ve skutečnosti nedostane vytištěn na vaší stránce, pokud to váš kód nevyzve, pokud je váš krátký kód volán,

add_filter( 'do_shortcode_tag','enqueue_my_script',10,3);
function enqueue_my_script($output, $tag, $attr){
  if('myShortcode' != $tag){ //make sure it is the right shortcode
    return $output;
  }
  if(!isset($attr['id'])){ //you can even check for specific attributes
    return $output;
  }
  wp_enqueue_script('my-shortcode-js'); //enqueue your script for printing
  return $output;
}

do_shortcode_tag byl zaveden v WP 4.7 a lze ho najít v nových vývojářských dokumentech pages.

1
Aurovrata

Děkujeme za sdílení tohoto tipu! Dalo mi to trochu bolesti hlavy, protože zpočátku to nefungovalo. Myslím, že v kódu nad has_my_shortcode existuje několik chyb (možná překlepů) a funkci přepíšu takto:

function has_my_shortcode( $posts ) {

        if ( empty($posts) )
            return $posts;

        $shortcode_found = false;

        foreach ($posts as $post) {

            if ( !( stripos($post->post_content, '[my-shortcode') === false ) ) {
                $shortcode_found = true;
                break;
            }
        }

        if ( $shortcode_found ) {
            $this->add_scripts();
            $this->add_styles();
        }
        return $posts;
    }

Myslím, že existovaly dva hlavní problémy: break nebyl v rozsahu příkazu if, a to způsobilo, že smyčka vždy přerušila první iteraci. Druhý problém byl jemnější a těžko zjistitelný. Výše uvedený kód nefunguje, pokud je krátký kód první věc napsaná v příspěvku. Abych to vyřešil, musel jsem použít operátor ===.

Mimochodem, děkuji moc za sdílení této techniky, hodně pomohlo.

1
jekbau