Woocommerce ajax позвоните на одной странице продукта - PullRequest
2 голосов
/ 04 марта 2020

Я получаю все свои продукты от API, и все те, кто являются вариациями друг друга, имеют общий мета-ключ под названием " api_product_family ". Продукты с одинаковым api_product_family являются вариантами друг друга, поэтому на одной странице у меня есть ловушка, где я отображаю другие варианты с изображением и привязываю их варианты.

Мой код:

function mv_variations() {
  global $post;
  global $wpdb;

  $product_id = $post->ID;

  $product_family = get_post_meta( $post->ID, 'api_product_family', true );

  if(!empty($product_family)) {
    $query = "
      SELECT post_id
      FROM " . $wpdb->prefix . "postmeta
      WHERE meta_value = '" . $product_family . "'
    ";

    $products = $wpdb->get_col($query);

    if(count($products) > 0) {
      for($i=0; $i<count($products); $i++) {
        if($products[$i] == $product_id) {
          unset($products[$i]);
        }
     }

      if(count($products) > 0) {
        print '<h3>Choose other variants: </h3>';
        foreach($products as $product) {
          $image = wp_get_attachment_image_src(get_post_thumbnail_id($product));
          print '<a href="' . get_permalink($product) . '"><img src="' . $image[0] . '" alt="img"/> </a>';
        }
      }
    }
  }
}

add_action( 'woocommerce_single_product_summary', 'mv_variations' );

Проблема: У меня много сообщений и много записей post_meta, поэтому загрузка занимает целую вечность, поэтому я подумал переместить всю эту функцию внутрь и AJAX вызов, чтобы не замедлять начальную загрузку. Проблема в том, что я понятия не имею, как это сделать с WordPress

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вы просто хотите запустить функцию WP с помощью AJAX?

1) Добавить ajax действий

Это необходимо запустить внутри основного файла плагина. Если вы запустите его только для кода c, он не будет работать. WP немного странный и все ajax использует admin- ajax. php

if ( wp_doing_ajax() ){
    add_action( 'wp_ajax_yourcustomfunction', array($this, 'yourcustomfunction') );
    add_action( 'wp_ajax_nopriv_yourcustomfunction', array($this, 'yourcustomfunction') );
}

function yourcustomfunction(){


    echo 'success';
    exit();

}

2) В JavaScript в бэкэнде у вас есть глобальный: ajaxurl для ajax url НО во внешнем интерфейсе вы должны передать это как переменную через wp_localize_script

$datatoBePassed = array(
    'ajaxurl' => admin_url( 'admin-ajax.php' ),
);

wp_localize_script( 'your_javascript_script', 'plugin_display_settings', $datatoBePassed );

In JS:

var datavar = {
     action: 'yourcustomfunction',
};

$.post(plugin_display_settings.ajaxurl, datavar, function(response){
 //response received here. It will be 'success' which is echoed in PHP
});

3) Если вы также хотите запустить одноразовый номер безопасности проверка (чтобы убедиться, что запрос действительно исходит от веб-сайта WP, предотвращает некоторые атаки), он становится немного сложнее:

$ datatoBePassed также должен включать 'security' => wp_create_nonce( 'yourplugin_security_nonce' ), datavar в JS включает security: plugin_display_settings.security,

Наконец, ваша PHP пользовательская функция начинается с:

// Check security nonce. 
    if ( ! check_ajax_referer( 'yourplugin_security_nonce', 'security' ) ) {
        wp_send_json_error( 'Invalid security token sent.' );
        wp_die();
    }
// If security check passed, run further 
0 голосов
/ 29 марта 2020

Так что я думаю, что вы можете получить лучшую производительность, используя WP_Query. Ниже я конвертировал то, что у вас есть в кастом WP_Query. Может потребоваться небольшая корректировка, но должно быть в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...