public function add_buy_together_menu() { add_menu_page( 'Buy Together', 'Buy Together', 'manage_woocommerce', 'sk-buy-together', [$this, 'render_admin_page'], 'dashicons-cart', 56 ); } public function admin_page_assets($hook) { if ($hook !== 'toplevel_page_sk-buy-together') return; wp_enqueue_script('jquery'); wp_enqueue_style('skbt-admin-page', false); wp_add_inline_style('skbt-admin-page', ' .skbt-wrap{max-width:1100px} .skbt-card{background:#fff;border:1px solid #e5e5e5;border-radius:14px;padding:14px;margin-top:12px} .skbt-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px} @media(max-width:900px){.skbt-grid{grid-template-columns:1fr}} .skbt-input{width:100%;padding:10px 12px;border:1px solid #ccd0d4;border-radius:10px} .skbt-results{border:1px solid #ccd0d4;border-radius:12px;overflow:auto;max-height:260px;margin-top:8px} .skbt-item{padding:10px 12px;border-bottom:1px solid #eee;cursor:pointer} .skbt-item:hover{background:#f6f7f7} .skbt-chip{display:inline-flex;gap:8px;align-items:center;border:1px solid #ddd;border-radius:16px;padding:6px 10px;margin:5px;background:#fff} .skbt-chip button{border:none;background:transparent;color:#b32d2e;font-weight:700;cursor:pointer} .skbt-btn{padding:10px 12px;border-radius:12px;border:0;cursor:pointer;font-weight:700} .skbt-btn-primary{background:#111;color:#fff} .skbt-muted{color:#666;font-size:12px} .skbt-row{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap} '); wp_enqueue_script('skbt-admin-page', false, ['jquery'], '1.0', true); wp_add_inline_script('skbt-admin-page', ' (function($){ var ajaxurl = "'.esc_js(admin_url('admin-ajax.php')).'"; var nonce = "'.esc_js(wp_create_nonce('skbt_admin')).'"; function searchProducts(q, $box){ if(q.length<2){ $box.empty(); return; } $.post(ajaxurl,{action:"sk_bt_search_products", q:q, nonce:"'.esc_js(wp_create_nonce('skbt_ajax')).'"},function(res){ $box.empty(); if(!res || !res.success || !res.data || !res.data.length){ $box.html("
No results
"); return; } res.data.forEach(function(p){ var txt = p.name+" (ID: "+p.id+")"+(p.sku?(" — SKU: "+p.sku):""); $box.append($("
",{class:"skbt-item"}).text(txt).data("pid",p.id)); }); }); } var mainId = 0; $("#skbt_main_search").on("input", function(){ searchProducts($(this).val().trim(), $("#skbt_main_results")); }); $("#skbt_add_search").on("input", function(){ searchProducts($(this).val().trim(), $("#skbt_add_results")); }); $(document).on("click","#skbt_main_results .skbt-item", function(){ mainId = parseInt($(this).data("pid"),10); $("#skbt_selected_main").text("Selected Main Product ID: "+mainId); loadLinks(); }); function loadLinks(){ if(!mainId) return; $("#skbt_linked").html("
Loading...
"); $.post(ajaxurl,{action:"skbt_admin_get_links", nonce:nonce, main_id:mainId}, function(res){ if(!res || !res.success){ $("#skbt_linked").html("
Failed to load
"); return; } renderLinked(res.data || []); }); } function renderLinked(list){ var $w = $("#skbt_linked").empty(); if(!list.length){ $w.html("
No linked products.
"); return; } list.forEach(function(p){ var txt = p.name+" (ID: "+p.id+")"+(p.sku?(" — SKU: "+p.sku):""); var $c = $("",{class:"skbt-chip","data-id":p.id}).append( $("").text(txt), $("'; echo ' '; echo '
'; echo ' '; echo '
'; echo ''; echo ''; } public function ajax_admin_get_links() { if (!current_user_can('manage_woocommerce')) wp_send_json_error(); $nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : ''; if (!wp_verify_nonce($nonce, 'skbt_admin')) wp_send_json_error(); $main_id = isset($_POST['main_id']) ? absint($_POST['main_id']) : 0; if (!$main_id) wp_send_json_success([]); $ids = get_post_meta($main_id, self::META_KEY, true); if (!is_array($ids)) $ids = array_filter(array_map('absint', explode(',', (string)$ids))); $out = []; foreach ($ids as $id) { $p = wc_get_product($id); if (!$p) continue; $out[] = ['id'=>$p->get_id(), 'name'=>$p->get_name(), 'sku'=>$p->get_sku()]; } wp_send_json_success($out); } public function ajax_admin_save_links() { if (!current_user_can('manage_woocommerce')) wp_send_json_error(); $nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : ''; if (!wp_verify_nonce($nonce, 'skbt_admin')) wp_send_json_error(); $main_id = isset($_POST['main_id']) ? absint($_POST['main_id']) : 0; $ids = isset($_POST['ids']) ? (array) $_POST['ids'] : []; $ids = array_values(array_unique(array_filter(array_map('absint', $ids)))); if (!$main_id) wp_send_json_error(); update_post_meta($main_id, self::META_KEY, $ids); wp_send_json_success(['saved'=>true, 'count'=>count($ids)]); } Products Archive - Page 143 of 203 - Sarkkart
Shop
Show:
Scroll To Top
Close
Close
Close

My Cart