0

PHP のstr_replace()関数を使用して、ページ内の選択された DIV のみをターゲットにすることは可能ですか (たとえば、ID またはクラスによって識別されます)。

状況: 次のstr_replace()関数を使用して、Wordpress 投稿エディターのすべてのチェックボックスを変換しています - カテゴリ メタボックスを代わりにラジオ ボタンを使用して、サイトの作成者が 1 つのカテゴリにのみ投稿できるようにします。

以下のコードは (WP3.5.1 で) 動作していますが、同じページの他のチェックボックス要素のコードを置き換えます。カテゴリ メタボックスのみをターゲットにする方法はありますか?

// Select only one category on post page
if(strstr($_SERVER['REQUEST_URI'], 'wp-admin/post-new.php') || 
strstr($_SERVER['REQUEST_URI'], 'wp-admin/post.php'))
{
  ob_start('one_category_only');
}

function one_category_only($content) {
  $content = str_replace('type="checkbox" ', 'type="radio" ', $content);
  return $content;
}
4

1 に答える 1

0

正規表現を使用してコンテンツ部分をIDでフィルタリングしてから、str_replaceを使用するか、次の例のように、DOMDocumentDOMXPathを使用してコンテンツをスキャンし、入力要素を操作することができます。

// test content
$content = '<div id="Whatever"><div id="YOURID"><input type="checkbox" /></div><div id="OTHER"><input type="checkbox" /></div></div>';

function one_category_only($content) {
    // create a new DOMDocument
    $dom=new domDocument;
    // load the html
    $dom->loadHTML($content);
    // remove doctype declaration, we just have a fragement...
    $dom->removeChild($dom->firstChild);  
    // use XPATH to grep the ID 
    $xpath = new DOMXpath($dom);
    // here you filter, scanning the complete content 
    // for the element with your id:
    $filtered = $xpath->query("//*[@id = 'YOURID']");
    if(count($filtered) > 0) { 
        // in case we have a hit from the xpath query,
        // scan for all input elements in this container
        $inputs = $filtered->item(0)->getElementsByTagName("input");
        foreach($inputs as $input){
            // and relpace the type attribute
            if($input->getAttribute("type") == 'checkbox') {
                $input->setAttribute("type",'radio');
            }
        }
    }
    // return the modified html
    return $dom->saveHTML();
}

// testing
echo one_category_only($content);
于 2013-02-11T08:43:34.670 に答える